【问题标题】:Can app.UseErrorHandler() access error details?app.UseErrorHandler() 可以访问错误详细信息吗?
【发布时间】:2017-01-16 20:17:10
【问题描述】:

在我的 MVC4 应用程序中,我有一个 global.asax.cs 覆盖 Application_Error(object sender, EventArgs e),我可以在其中提取 exceptionstatusCoderequestedUrl(用于处理 404)。这将被发送到我的控制器,并且 404s 与 5xx 的错误页面会有所不同(这些会获得堆栈跟踪)。我看不到如何使用UseErrorHandler() 将相同的信息添加到我的错误操作中。我在 ASP.NET Core 中使用了正确的方法吗?

【问题讨论】:

    标签: asp.net-core asp.net-core-mvc


    【解决方案1】:

    8 月2016 年 2 月 2 日 - 1.0.0 更新

    Startup.cs

    using Microsoft.AspNet.Builder;
    
    namespace NS
    {
        public class Startup
        {
             ...
             public virtual void Configure(IApplicationBuilder app)
             {
                 ...
                 app.UseExceptionHandler("/Home/Error");
                 ...
             }
         }
    }
    

    HomeController.cs

    using Microsoft.AspNet.Diagnostics;
    using Microsoft.AspNet.Http.Features;
    using Microsoft.AspNet.Mvc;
    using Microsoft.Extensions.Logging;
    
    namespace NS.Controllers
    {
        public class HomeController : Controller
        {
            static ILogger _logger;
            public HomeController(ILoggerFactory factory)
            {
                if (_logger == null)
                    _logger = factory.Create("Unhandled Error");
            }
    
            public IActionResult Error()
            {
                var feature = HttpContext.Features.Get<IExceptionHandlerFeature>();
                var error = feature?.Error;
                _logger.LogError("Oops!", error);
                return View("~/Views/Shared/Error.cshtml", error);
            }
        }
    }
    

    project.json

    ...
    "dependencies": {
        "Microsoft.AspNet.Diagnostics": "1.0.0",
         ...
    }
    ...
    

    【讨论】:

    • 谢谢。这适用于 500 个样式错误。但不幸的是,不是 404 错误。我想我需要另一种机制来处理 404 错误。
    • 你读过samples on diagnostic on github 吗?我认为StatucCodeSample 可以提供充分的帮助
    • 感谢您的链接。仍在学习如何处理 GitHub 上的所有 .NET 资产。 :-)
    • @aguafrommars 我在 RC1 上,但是当我将您的控制器代码复制到我的时,ContextIErrorHandlerFeature 都无法识别,并且 Intillisense 不建议添加任何 using 语句。我的 project.json 确实具有您列出的相同依赖项。此答案是否不再有效,或者是否有我遗漏的未列出的内容?
    • @MatthewVerstraete,这个答案应该对 RC1 有效,您可以在 github repo 上查看我的示例。也许您的代码中还有另一个问题。你的控制器是从Controller 派生的吗?
    【解决方案2】:

    在 Beta8 中,来自 mars 的 agua 的回答有点不同。

    代替:

    var feature = Context.GetFeature<IErrorHandlerFeature>();
    

    用途:

    var feature = HttpContext.Features.Get<IExceptionHandlerFeature>();
    

    这还需要引用 Microsoft.AspNet.Http.Features,以及 Startup.cs 中 Configure() 中的以下行:

    app.UseExceptionHandler("/Home/Error");
    

    【讨论】:

      【解决方案3】:

      根据您配置的错误处理操作,您可以执行以下操作:

      public IActionResult Error()
      {
          // 'Context' here is of type HttpContext
          var feature = Context.GetFeature<IErrorHandlerFeature>();
          if(feature != null)
          {
              var exception = feature.Error;
          }
      ......
      .......
      

      【讨论】:

      • 我需要再处理一下这个问题,但现在,我什至无法让 UseErrorHandler 调用我的操作。叹息..
      • 我也是 - 它不会调用操作 /home/error。我有 app.UseMvcWithDefaultRoute(); app.UseStaticFiles(); app.UseRuntimeInfoPage(); app.UseErrorHandler("/Home/Error");我可以直接打开/home/error
      • @ChrisHarrington:您需要将UseErrorHandler注册为管道中的第一个中间件
      • var feature = Context.GetFeature();它为什么在变量中显示空值?
      • IErrorHandlerFeature 在我的项目中无法识别。它位于哪里?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-10
      • 1970-01-01
      • 2016-02-08
      • 2013-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多