2017-07-26 99 views
1

目前我在啓用MiddlewareFilter時遇到了拋出異常的問題。只要我添加過濾器,即使開發人員異常也是毫無意義的(完整的堆棧跟蹤丟失)。ASP.NET Core MVC MiddlewareFilter異常無意義

services.AddMvc(options => options.Filters.Add(new MiddlewareFilterAttribute(typeof(MyFilter)))) 

public class MyFilter 
{ 
    public void Configure(IApplicationBuilder applicationBuilder, RequestLocalizationOptions options) 
    { 
     applicationBuilder.UseRequestLocalization(options); 
    } 
} 

堆棧跟蹤與過濾器:

System.Exception: Test Exception 
      at Microsoft.AspNetCore.Mvc.Internal.MiddlewareFilterBuilder.<>c.<<BuildPipeline>b__8_0>d.MoveNext() 
     --- End of stack trace from previous location where exception was thrown --- 
      at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
      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.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
      at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
      at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeNextResourceFilter>d__22.MoveNext() 
     --- End of stack trace from previous location where exception was thrown --- 
      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.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
      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.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
      at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
      at Microsoft.AspNetCore.ResponseCompression.ResponseCompressionMiddleware.<Invoke>d__3.MoveNext() 
     --- End of stack trace from previous location where exception was thrown --- 
      at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
      at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
      at SimpleInjector.SimpleInjectorAspNetCoreIntegrationExtensions.<>c__DisplayClass0_0.<<UseSimpleInjectorAspNetRequestScoping>b__0>d.MoveNext() 
     --- End of stack trace from previous location where exception was thrown --- 
      at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
      at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
      at Swashbuckle.AspNetCore.SwaggerUi.SwaggerUiMiddleware.<Invoke>d__5.MoveNext() 
     --- End of stack trace from previous location where exception was thrown --- 
      at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
      at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
      at Swashbuckle.AspNetCore.SwaggerUi.RedirectMiddleware.<Invoke>d__4.MoveNext() 
     --- End of stack trace from previous location where exception was thrown --- 
      at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
      at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
      at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.<Invoke>d__6.MoveNext() 
     --- End of stack trace from previous location where exception was thrown --- 
      at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
      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.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
      at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
      at Microsoft.VisualStudio.Web.BrowserLink.BrowserLinkMiddleware.<ExecuteWithFilter>d__7.MoveNext() 
     --- End of stack trace from previous location where exception was thrown --- 
      at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
      at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
      at Microsoft.AspNetCore.Cors.Infrastructure.CorsMiddleware.<Invoke>d__7.MoveNext() 
     --- End of stack trace from previous location where exception was thrown --- 
      at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
      at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
      at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.<Invoke>d__7.MoveNext() 

堆棧跟蹤不帶過濾器:

System.Exception: Test Exception 
    at MyProject.MyRepository.<Fetch>d__9.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.GetResult() 
    at MyProject.MyHandler.<Handle>d__7.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() 
    at MyProject.MyController.<Index>d__19.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeActionMethodAsync>d__27.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeNextActionFilterAsync>d__25.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ActionExecutedContext context) 
    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 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.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    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.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.AspNetCore.ResponseCompression.ResponseCompressionMiddleware.<Invoke>d__3.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at SimpleInjector.SimpleInjectorAspNetCoreIntegrationExtensions.<>c__DisplayClass0_0.<<UseSimpleInjectorAspNetRequestScoping>b__0>d.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Swashbuckle.AspNetCore.SwaggerUi.SwaggerUiMiddleware.<Invoke>d__5.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Swashbuckle.AspNetCore.SwaggerUi.RedirectMiddleware.<Invoke>d__4.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.<Invoke>d__6.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    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.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.VisualStudio.Web.BrowserLink.BrowserLinkMiddleware.<ExecuteWithFilter>d__7.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.AspNetCore.Cors.Infrastructure.CorsMiddleware.<Invoke>d__7.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.<Invoke>d__7.MoveNext() 

所以基本上我無法使過濾器時追查例外。你有什麼想法如何糾正這一點? (我需要使用MiddlewareFilters)

回答

1

檢查MiddlewareFilterBuilder implementation看起來這是一個 「預期」 的行爲後...

// Ideally we want the experience of a middleware pipeline to behave the same as if it was registered, 
// in Startup. In this scenario an exception thrown in a middelware later in the pipeline gets propagated 
// back to earlier middleware. 
// So check if a later resource filter threw an exception and propagate that back to the middleware pipeline. 
if (!resourceExecutedContext.ExceptionHandled && resourceExecutedContext.Exception != null) 
{ 
    throw resourceExecutedContext.Exception; 
} 

這也解釋了爲什麼你看到

System.Exception: Test Exception 
      at Microsoft.AspNetCore.Mvc.Internal.MiddlewareFilterBuilder.<>c.<<BuildPipeline>b__8_0>d.MoveNext() 

,而不是

System.Exception: Test Exception 
    at MyProject.MyRepository.<Fetch>d__9.MoveNext() 

還注意到,上面的代碼是在開發分支,但不是在主胸罩nch在aspnet/Mvc repo ...

所有這些似乎是MVC回購問題的一個很好的候選人。

+0

謝謝,我作爲一個問題報告。 – coalmee