我在Startup.cs中添加了一个中间件项目(称为CDASMiddleware),该项目可标识4xx http错误并重定向到错误处理程序,该错误处理程序将错误记录到数据库并显示
自定义错误页面。
例如,假设我希望跟踪404错误。中间件的Invoke方法使用以下代码处理该错误。
public async Task Invoke(HttpContext httpContext)
{
await _next(httpContext);
if (httpContext.Response.StatusCode == 404)
{
var message = $@"404 error. URL: {httpContext.Request.Path.Value} was not found.";
Error e = new Error() { StatusCode = "404", Message = message };
var obj = JsonConvert.SerializeObject(e);
httpContext.Session.SetString("HttpError", obj);
var url = httpContext.Request.PathBase + "/Error/HttpError";
httpContext.Response.Redirect(url, true);
}
}
并且的确,当调用此代码时,将调用相应的控制器方法,该方法将错误成功存储在数据库中,然后返回关联的视图。
public IActionResult HttpError()
{
var session = this.HttpContext.Session;
Error e = JsonConvert.DeserializeObject<Error>(session.GetString("HttpError"));
var el = GetErrorLogFromError(e); //create error log entry for db
_dataContext.ErrorLogDataSet.Upsert(el);
return View("~/Views/Shared/Error.cshtml", e);
}
如预期的那样,在浏览器中执行F12调试后,我看到了与重定向相关联的302(也尝试过301),以及随后在HTTP正文中带有正确html视图的200响应。因此浏览器将获得正确的视图。但是它不会呈现,并且浏览器的URL不会更改以反映重定向。
哦,Startup.cs中的Configure方法是
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, ICDASDataContext dataContext)
{
app.UseSession();
app.UseCDASMiddleware();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage(); //show detailed error page to developer
app.UseBrowserLink();
}
else
{
app.UseExceptionHandler("/CDASUnhandledException"); //log to the database and show a custom error page to user for unhandled exceptions
Func<string, LogLevel, bool> f = ((s, logLevel) => logLevel >= LogLevel.Error); //log handled errors
loggerFactory.AddProvider(new CDASLoggerProvider(f, dataContext));
}
app.UseStaticFiles();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "AreaRoute",
template: "{area:exists}/{controller}/{action}",
defaults: new { controller = "Home", action = "Index" });
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
有任何想法吗?
最佳答案
如果发起调用是javascript ajax调用(如在此头刮擦器中那样),则中间件中的重定向会导致服务器创建重定向页面并将其返回到ajax调用的fail回调。在该回调中,document.write(data.responseText)可用于呈现错误页面。