Bir MVC projem var. Bu MVC projesi, içeriği tekrar istemciye aktarması gereken bir Denetleyici içerir. Akış başladığında, içerik uzunluğunu belirlemenin bir yolu yoktur (anında hesaplanır). (Ben zaten uygun http başlıklarını tamponlu çıkışı devre dışı ve ekledim) Ben HttpContext.Current.Response.OutputStream açın ve periyodik yazma ve Flushing başlatın:MVC Denetleyici, Chunked içerik kodlamasını döndürüyor
while (some condition){
HttpContext.Current.Response.OutputStream.Write(buffer, 0, buffer.Length);
HttpContext.Current.Response.Flush();
}
Sonra kapatmak için akış zorlarsanız:
HttpContext.Current.Response.Close();
düzgün (istemciye EOF göstermek için, ucunda bir 0 boy yığın ekleme değildir) yığın halinde içerik bitmez.
yerine daha incelikle çıkış akışı kapatırsanız:
HttpContext.Current.Response.End();
VEYA
HttpContext.Current.ApplicationInstance.CompleteRequest();
Düzgün akışı (sonuna eklenen sıfır uzunluk yığın) kapatır, ancak tarafından atılan bir istisna olsun Akış zaten yazılmış olduğundan, HTTP akışlarını çıkış akışına ekleyemeyeceğini belirten uygulama!
Her iki durumda da, Denetleyici null (veya EmptyActionResult) döndürmek için devam eder.
İstisna neden olduğu için, MVC yığınının, her ActionResult'un, Denetleyicinin çalışmasını bitirdikten sonra HTTP üstbilgileri ayarlamasını gerektirdiğini varsayıyorum. Bu durumda, MVC'de bir Chunked akışı nasıl uygulanır?
Şimdiden teşekkürler!
DÜZENLEME: Tam istisna atılan geçerli:
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)