我在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?}");
});
}
有什么想法吗?
答案 0 :(得分:0)
如果启动调用是javascript ajax调用,就像在这个头部刮擦器中的情况一样,中间件中的重定向会导致服务器创建重定向页面并将其返回到ajax调用的失败回调。在该回调中,可以使用document.write(data.responseText)来呈现错误页面。