2016-10-04 50 views
1

我正在將Web API 2應用程序遷移到MVC 6,並且我很努力地弄清楚如何在狀態代碼404或405發生時返回自定義響應。在Web API中,我使用了HttpMessageHandler代替404,使用DelegatingHandler代替405.MVC中404s的自定義響應6

我意識到中間件的概念,但似乎中間件沒有在管道中執行足夠晚的時間來捕獲404。 ,因此在中間件中生成響應是次優的,因爲HttpResponse類僅公開原始HTTP參數,如ContentLengthBody。我寧願簡單地返回一個包含像我所有常規終端一樣的自定義響應模型的IActionResult

的啓動代碼:

applicationBuilder.UseMiddleware<NotFoundMiddleware>(); 
applicationBuilder.UseMvc(); 

中間件:

public class NotFoundMiddleware 
{ 
    private readonly RequestDelegate _next; 

    public NotFoundMiddleware(RequestDelegate next) 
    { 
     _next = next.EnsureNotNull(nameof(next)); 
    } 

    public Task Invoke(HttpContext context) 
    { 
     if (context.Response?.StatusCode == StatusCodes.Status404NotFound) 
     { 
      // context.Response.StatusCode is 200 because context.Response is set to an instance of DefaultHttpResponse 
     } 

     return _next.Invoke(context); 
    } 
} 

有沒有完成的事情,我需要的好辦法?

回答

2

重新排列你如何執行你的邏輯

public class NotFoundMiddleware { 
    private readonly RequestDelegate _next; 

    public NotFoundMiddleware(RequestDelegate next) { 
     _next = next.EnsureNotNull(nameof(next)); 
    } 

    public async Task Invoke(HttpContext context) { 
     //let the context go through the pipeline 
     await _next.Invoke(context); 

     if (context.Response?.StatusCode == StatusCodes.Status404NotFound) { 
      //execute your logic on the way out of the pipeline. 
     } 

    } 
} 

,並確保你在管線中較早地進行註冊

+0

我會嘗試這個,謝謝。我修改了我的問題,以包含關於MVC 6不使用405s的附加問題。 – NathanAldenSr

+0

你的建議當然有效。我將把405s的問題提出一個新的問題。關於在中間件中設置響應內容的更簡單方法,您有任何建議嗎?我真的必須自己序列化一切嗎? – NathanAldenSr

+0

從我的理解你應該能夠像以前一樣使用它。中間件允許更多的可擴展性,但從前的過程並沒有改變太多。一些新的接口,但結構或多或少是相同的,例如看這篇關於路由的文章http://stephenwalther.com/archive/2015/02/07/asp-net-5-deep-dive-routing – Nkosi