2013-07-25 16 views
6

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) 

cevap

2

çözüm bulundu.

kodlama 0 uzunluk yığın ile kapatılmalıdır yığın halinde HTTP 1.1 standardını belirtir, istek modu canlı tutma

canlı tutma modunda olduğu zaman, istemci/sunucu arasındaki bağlantı için birden çok kalıcıdır istek/yanıt. Chunked kodlamanın bu bağlamda sıfır uzunluktaki yığın ile bitmesi gerekir, çünkü istemcinin önceki yanıtın ne zaman biteceğini bilmesi için başka bir yol yoktur.

"Bağlantı: bekle-canlı" yerine başlığa "Bağlantı: kapat" olarak belirtirseniz, bağlantı isteğiniz arasında kalıcı olmazsa, istemci bağlantıyı sonlandırma belirtisi olarak kullanabilir ve EOF'yi belirten 0 uzunluk parçasını gerektirmez.

Sadece elle kullanarak HTTPResponse kapatmaya karar verdik: Daha önce kodunda belirtilen ettikten bağlantı EOF üzerine kapanacak o müşteri anlatmak için

HttpContext.Current.Response.Close(); 

iken. Bu, istemcinin 0 uzunluk parçasını almadığı sorunu çözdü, çünkü artık istemci bunu gerektirmiyor.

İlgili konular