Mam projekt MVC. Ten projekt MVC zawiera jeden kontroler, który musi przesyłać treści strumieniowo do klienta. Po rozpoczęciu przesyłania strumieniowego nie ma możliwości określenia długości zawartości (obliczana jest on-the-fly). Więc otwieram HttpContext.Current.Response.OutputStream i rozpocząć pisanie i Flushing okresowo (ja już wyłączona buforowane wyjście i dołączone odpowiednie nagłówki HTTP):Kontroler MVC powracający Kodowanie treści kodowanych
while (some condition){
HttpContext.Current.Response.OutputStream.Write(buffer, 0, buffer.Length);
HttpContext.Current.Response.Flush();
}
Gdybym wtedy wymusić zamknięcie strumienia:
HttpContext.Current.Response.Close();
nie ma właściwie końca zawartości pakietowego (nie wstawiaj 0 długość kawałek na końcu, aby wskazać EOF do klienta).
Jeśli zamiast zamknięcia strumienia wyjściowego bardziej bezpiecznie:
HttpContext.Current.Response.End();
lub
HttpContext.Current.ApplicationInstance.CompleteRequest();
właściwy sposób zamyka się (fragment zerowej długości dołączony do końca) strumienia, ale pojawia się wyjątek generowane przez aplikacja, wskazując, że nie może wstawić nagłówków HTTP do strumienia wyjściowego, ponieważ strumień został już napisany!
W obu przypadkach kontroler powraca do wartości null (lub EmptyActionResult).
Zakładam, że wyjątek jest spowodowany, ponieważ stos MVC wymaga, aby wszystkie ActionResult ustawiały nagłówki HTTP po zakończeniu działania kontrolera. Jeśli tak jest, jak można wdrożyć strumień Chunked w MVC?
Z góry dziękuję!
EDIT: Dokładna wyjątkiem wyrzucane jest:
Uncaught Exception: System.Web.HttpException (0x80004005): Server cannot set status after HTTP headers have been sent.
at System.Web.Http.WebHost.HttpControllerHandler.EndProcessRequest(IAsyncResult result)
at System.Web.Http.WebHost.HttpControllerHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result)
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)