【问题标题】:UseStatusCodePagesWithReExecute Unhandled Exception Duplicate Key: System.ObjectUseStatusCodePagesWithReExecute 未处理的异常重复键:System.Object
【发布时间】:2017-06-04 22:22:59
【问题描述】:

AsP.Net Core UseStatusCodePagesWithReExecute(),我正在重定向到 /StatusCode/{0}。我以前使用UseStatusCodePagesWithRedirect() 没有任何明显的问题,但自从更改后,以前重定向的请求现在会导致未处理的异常:

ArgumentException:已添加具有相同键的项目。键:System.Object

这是 VS15 调试窗口的输出:

Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request starting HTTP/1.1 GET http://localhost:5000/guides/some-guide/introdu  
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Information: Executing action method WebSite.Controllers.GuideController.ReadSection (WebSite) with arguments (some-guide, introdu) - ModelState is Valid
Microsoft.EntityFrameworkCore.Storage.IRelationalCommandBuilderFactory:Information: Executed DbCommand (0ms) [Parameters=[@__permalink_0='?' (Size = 450)], CommandType='Text', CommandTimeout='30']
SELECT TOP(2) [s].[SectionId], [s].[Description], [s].[DisplayPosition], [s].[DocumentId], [s].[Permalink], [s].[Title], [d].[DocumentId], [d].[CategoryId], [d].[Description], [d].[DisplayPosition], [d].[Permalink], [d].[Subtitle], [d].[Title]
FROM [Sections] AS [s]
INNER JOIN [Documents] AS [d] ON [s].[DocumentId] = [d].[DocumentId]
WHERE [s].[Permalink] = @__permalink_0
ORDER BY [s].[SectionId]
Microsoft.AspNetCore.Mvc.StatusCodeResult:Information: Executing HttpStatusCodeResult, setting HTTP status code 404
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Information: Executed action WebSite.Controllers.GuideController.ReadSection (WebSite) in 15.6192ms
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Information: Executing action method WebSite.Controllers.ErrorController.StatusCode (WebSite) with arguments (404) - ModelState is Valid
WebSite.Controllers.ErrorController:Information: Unexpected Status Code: 404, OriginalPath: /guides/some-guide/introdu
'dotnet.exe' (CoreCLR: clrhost): Loaded 'g4tz3vmn.35h'. Cannot find or open the PDB file.
Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.ViewResultExecutor:Information: Executing ViewResult, running view at path /Views/Error/Index.cshtml.
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Information: Executed action WebSite.Controllers.ErrorController.StatusCode (WebSite) in 86.9564ms
'dotnet.exe' (CoreCLR: clrhost): Loaded 'C:\Users\Me\.nuget\packages\System.Diagnostics.StackTrace\4.3.0\lib\netstandard1.3\System.Diagnostics.StackTrace.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'dotnet.exe' (CoreCLR: clrhost): Loaded 'C:\Program Files\dotnet\shared\Microsoft.NETCore.App\1.1.0\System.IO.MemoryMappedFiles.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'dotnet.exe' (CoreCLR: clrhost): Loaded 'C:\Program Files\dotnet\shared\Microsoft.NETCore.App\1.1.0\System.IO.UnmanagedMemoryStream.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware:Error: An unhandled exception has occurred while executing the request

System.ArgumentException: An item with the same key has already been added. Key: System.Object
   at System.ThrowHelper.ThrowAddingDuplicateWithKeyArgumentException(Object key)
   at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeNextResourceFilter>d__22.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ResourceExecutedContext context)
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeAsync>d__20.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNetCore.Builder.RouterMiddleware.<Invoke>d__4.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at WebMarkupMin.AspNetCore1.WebMarkupMinMiddleware.<Invoke>d__5.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNetCore.Builder.StatusCodePagesExtensions.<>c__DisplayClass6_0.<<UseStatusCodePagesWithReExecute>b__0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNetCore.Diagnostics.StatusCodePagesMiddleware.<Invoke>d__3.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.VisualStudio.Web.BrowserLink.Runtime.BrowserLinkMiddleware.<ExecuteWithFilter>d__7.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.<Invoke>d__7.MoveNext()
Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request finished in 342.116ms 500 text/html; charset=utf-8

看起来它正在执行我的 StatusCode 控制器操作,记录错误的原始路径,然后 bam,我得到了异常。是什么导致了这个错误?

【问题讨论】:

    标签: asp.net-core asp.net-core-mvc unhandled-exception asp.net-core-middleware


    【解决方案1】:

    我在使用错误处理时遇到了同样的错误:

    app.UseStatusCodePagesWithReExecute("/Error/{0}")
    

    对我来说,问题是在我的错误处理程序操作中使用了 HttpGetAttribute:

    [HttpGet("/Error/{status}")]
    public IActionResult Error(string status) { ..
    

    当我将属性更改为使用 RouteAttribute(即,也支持 POST、PUT 等)时,它起作用了:

    [Route("/Error/{status}")]
    public IActionResult Error(string status) { ..
    

    查看更多... GitHub AspNetCore Issue

    【讨论】:

    • omg,就是这样,我也遇到过,浪费了这么多时间寻找解决方案。感谢您抽出时间在此处发布。
    • 不客气,很高兴能帮上忙……就像这里的许多其他人多年来为我所做的一样!:)
    【解决方案2】:

    我遇到了同样的问题,但没有使用 BrowserLink。但就像 Rytmis 所说,它似乎确实是由 TempData 引起的。如果您没有在任何地方使用 TempData,请将 Startup.cs 中的 AddMvc 调用更改为以下内容应该可以解决它:

     services.AddMvc(options =>
     {
         options.Filters.Remove(new SaveTempDataAttribute());
     });
    

    小心那个,这是一个丑陋的黑客。

    就我而言,根本问题是我的错误控制器使用ControllerBase.HttpContext 属性继承的基类。一旦我将其更改为从 IHttpContextAccessor 获取 httpContext,问题就消失了。

    【讨论】:

      【解决方案3】:

      堆栈很难阅读,因为它是发布版本中的异步代码,但它与 EF 没有任何关系。我必须使用 MVC 的源代码进行调试才能找到它。

      这似乎是负责保存 TempData 的中间件中的一个错误。该路径的代码不同in the latest version of MVC

      不过,有趣的是:至少对我来说,触发器似乎是 BrowserLink。因此,如果您的 Startup.cs 包含

      app.UseBrowserLink();
      

      在任何时候,尝试评论它,看看它是否有帮助。

      【讨论】:

        【解决方案4】:

        我不确定你为什么会出现这种异常。

        出于测试目的,我在 VS 2015 中创建了一个新的 ASP.NET Core Web Application

        我选择了Web Application 模板来获取已经到位的基本内容。

        Startup.cs 文件的Configure() 方法内,就在app.UseStaticFiles(); 上方,我添加了以下内容:

        app.UseStatusCodePagesWithReExecute("/Home/Error2/{0}");
        

        然后我在HomeController 中添加了Error2 ActionResult,如下所示:

        public IActionResult Error2(string id)
        {
            return View();
        }
        

        我在 Views--Home 文件夹中创建了 Error2.cshtml 视图。

        我在Error2() 方法的return View(); 上设置了一个断点,并在调试中启动了应用程序。

        我成功导航到About页面(http://localhost:63595/Home/About),然后我故意添加错误触发404如:http://localhost:63595/Home/Abouteeee

        我的断点被击中,string id 参数保持“404”。

        我知道这可能无法回答您的问题,但也许先采取一些小步骤让事情开始运作,然后逐渐添加内容可能(或不)帮助您查明罪魁祸首。

        【讨论】:

        • 我试图将其分解,但我很难找到它所指的字典。我没有在所有情况下都收到错误,只有当我使用路径元素来检索数据库记录时。在这些情况下,如果控制器和操作拼写错误或不存在,则可以按预期重新执行工作。只有在查询数据库时才会出现问题。由于我没有明确的字典,这可能与 EF 有关吗?我还没有找到引发异常的调用。
        • 在快速浏览整个堆栈时,我注意到以下内容:已添加具有相同键的项目。此错误似乎与 INSERT 有关。既然您刚刚提到了与 EF 相关的内容,那么是的……这可能就是您收到异常的原因。顺便说一句……乍一看,您似乎遇到的错误与您的帖子标题无关。
        • 谢谢文斯,我会深入研究一下,看看我想出了什么。我按原样命名该帖子,因为该错误仅在我从带有重定向的状态代码页面更改为重新执行时出现,所以我认为它与此有关。一旦我更好地处理了这个问题,我将重命名。
        • 我不太确定我是否缩小了范围,或者我是否正在进入兔子洞。但是,我发现如果我的 StatusCode 视图使用 Layout = null; 以外的任何布局,如果该布局具有 @RenderBody() 以外的任何布局,则会引发异常。即使&lt;html&gt;@RenderBody() 会导致异常。我还发现对app.UseWebMarkupMin() 的调用会引发异常,而不管其他任何事情。我已经削减了所有内容,所以它除了重新执行之外什么都不做,它仍然会导致问题。但令人沮丧的是,我无法在一个全新的项目中重新创建它。有什么想法吗?
        • 其实这并不完全正确。我已经把它缩小到开口,只有开口htmlheadtitle标签。如果我删除这些,则不会引发错误,我可以渲染视图布局并且一切都按预期工作。我仍然无法在新项目中重新创建它。我已经删除了WebMarkupMin,以防有任何影响,但没有改变。我彻底困惑了。
        猜你喜欢
        • 1970-01-01
        • 2018-10-16
        • 2014-06-24
        • 1970-01-01
        • 2018-10-15
        • 1970-01-01
        • 2015-12-17
        • 2023-03-12
        • 1970-01-01
        相关资源
        最近更新 更多