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?
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
回答1:
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",
...
}
...
回答2:
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");
回答3:
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;
}
......
.......