我在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)可用于呈现错误页面。

09-16 07:38