1 因為:Close()方法會呼叫HttpWorkerRequest.CloseConnection()方法。終止(Terminate)與客戶端的套接字連線,並使得伺服器,客戶端以及之間設施上的快取(buffer)失效。導致傳送到客戶端的資料丟失。
2 方法Response.End()是為了相容經典ASP程式,在Asp.NET 1.0中引入的,在呼叫後會丟擲ThreadAbortException異常。成功時則中止(abort)當前的執行緒,處理管道觸發EndRequest事件,不再處理之後的程式碼。會以同步的方式將響應內容傳送(flush)給客戶端。
由於.NET 設計原因,Response.End()在WebForm框架下可以終止程式碼執行,不再處理End()之後的程式碼。在MVC框架下則只是返回響應流,不會中止程式碼執行。
3 此外還可以使用HttpApplication.CompleteRequest()方法結束請求。
Response.Flush();
this.Context.ApplicationInstance.CompleteRequest();
綜上所述:只有程式碼發生錯誤(惡意的攻擊),希望終止對於客戶端的響應/連線時才可以使用Response.Close()
如果你想結束請求,並向客戶端傳送請求則應該優先使用HttpApplication.CompleteRequest()方法。
1 因為:Close()方法會呼叫HttpWorkerRequest.CloseConnection()方法。終止(Terminate)與客戶端的套接字連線,並使得伺服器,客戶端以及之間設施上的快取(buffer)失效。導致傳送到客戶端的資料丟失。
2 方法Response.End()是為了相容經典ASP程式,在Asp.NET 1.0中引入的,在呼叫後會丟擲ThreadAbortException異常。成功時則中止(abort)當前的執行緒,處理管道觸發EndRequest事件,不再處理之後的程式碼。會以同步的方式將響應內容傳送(flush)給客戶端。
由於.NET 設計原因,Response.End()在WebForm框架下可以終止程式碼執行,不再處理End()之後的程式碼。在MVC框架下則只是返回響應流,不會中止程式碼執行。
3 此外還可以使用HttpApplication.CompleteRequest()方法結束請求。
Response.Flush();
this.Context.ApplicationInstance.CompleteRequest();
綜上所述:只有程式碼發生錯誤(惡意的攻擊),希望終止對於客戶端的響應/連線時才可以使用Response.Close()
如果你想結束請求,並向客戶端傳送請求則應該優先使用HttpApplication.CompleteRequest()方法。