Asp.Net中的重定向核心中间件不呈现目标页面

时间:2017-02-08 16:52:24

标签: c# asp.net-core-mvc middleware response.redirect

我在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?}");


            });
        }

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

如果启动调用是javascript ajax调用,就像在这个头部刮擦器中的情况一样,中间件中的重定向会导致服务器创建重定向页面并将其返回到ajax调用的失败回调。在该回调中,可以使用document.write(data.responseText)来呈现错误页面。