[英]Redirect in Asp.Net Core middleware does not render target page
我在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響應。 因此瀏覽器獲得正確的視圖。 但它沒有呈現,瀏覽器網址也不會改變以反映重定向。
哦,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調用的失敗回調。 在該回調中,可以使用document.write(data.responseText)來呈現錯誤頁面。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.