Can app.UseErrorHandler() access error details?

2020-02-28 06:17发布

In my MVC4 app I had a global.asax.cs override of Application_Error(object sender, EventArgs e) where I could extract the exception, statusCode and requestedUrl (for handling 404). That would get sent to my controller and the error page would be different for 404s vs 5xx (these get a stack trace). I don't see how to get this same info to my Error action using UseErrorHandler(). Am I using the right approach in ASP.NET Core?

3条回答
We Are One
2楼-- · 2020-02-28 06:44

Aug. 02th 2016 - Update for 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",
     ...
}
...
查看更多
混吃等死
3楼-- · 2020-02-28 07:02

From your configured error handling action, you could do something like:

public IActionResult Error()
{
    // 'Context' here is of type HttpContext
    var feature = Context.GetFeature<IErrorHandlerFeature>();
    if(feature != null)
    {
        var exception = feature.Error;
    }
......
.......
查看更多
一夜七次
4楼-- · 2020-02-28 07:05

In Beta8, agua from mars' answer is a little different.

Instead of:

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

Use:

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

This also requires a reference to Microsoft.AspNet.Http.Features, and the following line in Configure() in Startup.cs:

app.UseExceptionHandler("/Home/Error");
查看更多
登录 后发表回答