2012-08-10 24 views
2

我用來結束我的傳輸到客戶端通過沖洗和結束在下面的代碼。如果我之後直接使用`Response.End()`,`Response.Flush()`有意義嗎?

Response.Flush(); 
Response.End(); 

然而,它只是打我,Response.End()刷新緩存內容到客戶端。那麼在序列中使用兩者有什麼意義?

+0

是到Response.End異常結束和調用事件EndRequest。 Response.Flush:發送到客戶端的所有當前緩衝輸出力 – 2012-08-10 01:18:09

+2

您應該在HttpApplication對象上使用'CompleteRequest()'來結束請求(並且如果需要,請繼續處理)。不要使用'Response.End'。閱讀原因。被接受的答案最終會使用它,但是有沒有一個很好的理由讓你使用異常來終止響應線程? – 2012-08-10 02:48:09

+0

@AndrewBacker不,沒有。除非你指望「我一直這樣做,所以它會自動使用它」,這是一個非常好的理由。你的意思是應該先沖洗然後完成,對吧?我只會去Response.ContentType =「text/xml」;回覆於(GetXmlData()InnerXml。); Response.Flush(); Context.ApplicationInstance.CompleteRequest(); 偉大的信息。 – 2012-08-10 09:37:57

回答

4

總之,沒有,但有兩個之間的重要區別:

Response.Flush()爲所有處理完成之前寫入的響應的部分有用的(即,如果響應緩衝被禁用)。 Flush()之後的任何代碼都將繼續執行,並且任何之前的Response.Write()都將刷新到客戶端。

Response.End()更殘酷一點......它不僅會中止當前線程,而且會這樣做會拋出ThreadAbort異常並終止當前請求。除非您正確處理異常,否則Response.End()後面的任何代碼將永遠不會看到日光。

正如您所指出的那樣,End()將會沖洗緩衝內容。在一些情況下結束()實際上將調用Flush()在內部,具體地,如果上下文不撤銷:螺紋的

public void End() 
{ 
    if (this._context.IsInCancellablePeriod) 
    { 
     InternalSecurityPermissions.ControlThread.Assert(); 
     Thread.CurrentThread.Abort(new HttpApplication.CancelModuleException(false)); 
    } 
    else if (!this._flushing) 
    { 
     this.Flush(); 
     this._ended = true; 
     if (this._context.ApplicationInstance != null) 
     { 
      this._context.ApplicationInstance.CompleteRequest(); 
     } 
    } 
} 
相關問題