2017-01-31 16 views
5

Mam middleware, który ukrywa wyjątek od klienta i zwraca błąd 500 w przypadku żadnego wyjątku:ustawić status odpowiedź w ASP.NET rdzenia middleware

public class ExceptionHandlingMiddleware 
{ 
    private readonly RequestDelegate _next; 

    public ExceptionHandlingMiddleware(RequestDelegate next) 
    { 
     _next = next; 
    } 

    public async Task Invoke(HttpContext context) 
    { 
     try 
     { 
      await _next.Invoke(context); 
     } 
     catch (Exception exception) 
     { 
      var message = "Exception during processing request"; 
      using (var writer = new StreamWriter(context.Response.Body)) 
      { 
       context.Response.StatusCode = 500; //works as it should, response status 500 
       await writer.WriteAsync(message); 
       context.Response.StatusCode = 500; //response status 200 
      } 
     } 
    } 
} 

Moim problemem jest to, że jeśli ja ustawić status odpowiedzi przed pisząc treść, klient zobaczy ten status, ale jeśli ustawię status po wysłaniu wiadomości do ciała, klient otrzyma odpowiedź ze statusem 200.

Czy ktoś mógłby mi wyjaśnić, dlaczego tak się dzieje?

P.S. Używam ASP.NET Core 1.1

Odpowiedz

7

Jest to zgodne z projektem, gdy wiesz, jak działa HTTP.

Nagłówki znajdują się na początku strumienia danych (patrz wiki example). Po wysłaniu danych nie można zmienić/zmodyfikować nagłówków, ponieważ dane zostały już wysłane za pomocą kabla.

Będziesz musiał buforować całą odpowiedź, jeśli chcesz ją później ustawić, ale zwiększy to zużycie pamięci. Tutaj a sample o zamianie strumienia strumienia pamięci.