2017-02-08 8 views
1

Startup.cs에서 4xx http 오류를 식별하고 오류를 데이터베이스에 기록하고 표시하는 오류 처리기로 리다이렉션하는 미들웨어 항목 (CDASMiddleware)을 추가했습니다 사용자 정의 오류 페이지.Asp.Net의 리디렉션 코어 미들웨어가 대상 페이지를 렌더링하지 않습니다

예를 들어 404 오류를 추적하려고한다고 가정 해 봅시다. 미들웨어의 Invoke 메서드는 다음 코드로 오류를 처리합니다. 이 코드를 호출 할 때 실제로 해당 컨트롤러 메소드가 성공적으로 다음 데이터베이스의 오류를 저장하고있는라고

public async Task Invoke(HttpContext httpContext) 
{ 
    await _next(httpContext); 
    if (httpContext.Response.StatusCode == 404) 
    { 
     var message = [email protected]"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 디버그를 수행하면, I는 302 리디렉션 및 HTTP 본문에서 올바른 HTML 뷰와 후속하는 200 응답과 관련된 (도 301 시도)을 참조. 따라서 브라우저가 올바른보기를 얻습니다. 그러나 렌더링되지 않으며 브라우저 URL이 리디렉션을 반영하도록 변경되지 않습니다.

아, 그리고 Startup.cs의 구성 방법은

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

head scratcher에서와 같이 시작 호출이 javascript ajax 호출 인 경우 미들웨어의 리디렉션은 서버가 리디렉션 된 페이지를 작성하고이를 ajax 호출의 실패 콜백으로 리턴합니다. 이 콜백에서 document.write (data.responseText)를 사용하여 오류 페이지를 렌더링 할 수 있습니다.