簡體   English   中英

Asp.Net中的重定向核心中間件不呈現目標頁面

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM