2017-02-11 56 views
2

我已经定义是这样我的自定义错误页处理程序“具有相同键的项回到404的时候已经被添加”排除错误

public class ErrorController : Controller 
{ 
    public IActionResult Index(int errorCode) 
    { 
     switch (errorCode) 
     { 
      case 404: 
       return View($"~/Views/Error/{errorCode}.cshtml"); 
     } 

     return View(errorCode); 
    } 
} 

当在生产模式下一切正常,但在开发时,有两种情况:

  1. 我打404页“就像那样”,我t的显示我的自定义404页面(这是正确的)
  2. 我强迫404从行动例如。

    if(nothingFound) 
    { 
        return NotFound(); 
    } 
    

    ,然后它进入ErrorController行动,甚至视图(404.cshtml),但它打印后整个调试标题:

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

使用app.UseDeveloperExceptionPage()时是否正常?还是我有一些未配置的东西?

UPDATE

堆栈跟踪:

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 Microsoft.AspNetCore.Authentication.AuthenticationMiddleware`1.<Invoke>d__18.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
    at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware`1.<Invoke>d__18.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.AspNetCore.Localization.RequestLocalizationMiddleware.<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 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() 
+0

你是说异常消息显示在开发服务器而不是达到ErrorController? – Kira

+0

请发布该异常的堆栈跟踪。 –

+0

@Kira是的,但只有当我强迫错误使用某些功能,例如。未找到()。当访问非现有路线时,它既适用于生产也适用于开发。我完全没有要求在开发模式下到达错误控制器,但我希望除了这个例外以外。 –

回答

2

的错误是由于调用UseBrowserLink(),您可以管理相关的菜单此功能。

如果取消选中启用浏览器链接错误消失。

enter image description here

我不知道是什么引起的问题,但这里是链接到UseBrowserLink docs

+0

也许你可以扩展你的答案来解释导致这个错误的浏览器链接在这里做什么? – poke

0

我有类似的问题。后来我发现问题与我使用中间件的顺序有关。我正在使用中间件编写响应头文件,如X-Content-Type-Options和其他头文件。我刚刚将这个移动到了app.UseStatusCodePagesWithReExecute之上,它开始正常工作。所以我目前的代码是这样的:

app.Use(async (context, next) => 
     { 
      context.Response.Headers.Add("X-Content-Type-Options", "nosniff"); 
      context.Response.Headers.Add("X-Xss-Protection", "1"); 
      context.Response.Headers.Add("X-Frame-Options", "SAMEORIGIN"); 
      await next(); 
     }); 

     if (env.IsDevelopment()) 
     { 
      app.UseDeveloperExceptionPage(); 
      app.UseDatabaseErrorPage(); 
      app.UseBrowserLink(); 
     } 
     else 
     { 
      app.UseStatusCodePagesWithReExecute("/Home/Error/{0}"); 
     } 

希望这可以帮助像我这样的类似问题的任何人。