2010-04-16 79 views
20

我的網絡應用程序必須處理並提供大量數據才能顯示特定頁面。有時,用戶在服務器仍在忙於處理頁面時關閉或刷新頁面。這意味着服務器將繼續處理數分鐘的數據,只將其發送給不再監聽的客戶端。http服務器能檢測到客戶端已經取消了他們的請求嗎?

是否有可能檢測到連接已斷開並對其作出反應?

在這個特定的項目中,我們使用Django和NginX,或者Apache。我認爲這是可能的,因爲Django開發服務器通過打印Broken Pipe異常來對已取消的請求做出反應。我很想讓它引發我的應用程序代碼可以捕獲的異常。 It appears JSP can do thisSo can node.jshere

或者,我可以在有問題的頁面上註冊卸載事件處理程序,讓它執行一個同步XHR,請求取消該用戶的先前請求,並進行某種進程間通信以實現此目的。也許,如果較慢的數據處理都交給了另一個進程,我可以更容易地識別和殺滅,而不殺死響應過程...

回答

0

HTTP是無狀態的,因此檢測斷開的客戶端是通過超時的唯一途徑。

查看this的回答SO問題(Java Servlet:如何檢測瀏覽器關閉?)。

+0

我認爲無狀態是正確的無字連字,:) – jerjer 2010-04-16 10:16:10

+0

@jerjer - 感謝您的更正:) – Oded 2010-04-16 10:17:16

+0

這似乎很奇怪,因爲TCP應該能夠做到這一點。我想有些東西在抽象中會丟失。 – 2010-04-16 10:20:01

9

雖然@Oded是正確的HTTP是無狀態請求之間,當底層的TCP/IP連接中斷對被處理請求應用服務器可以確實檢測。爲什麼是這樣?由於TCP是可靠連接的有狀態協議。

處理資源密集型請求的.Net Web應用程序的常用技術是在開始資源密集型工作之前檢查Response.IsClientConnecteddocs)。浪費CPU週期來向不再存在的客戶端發送昂貴的響應毫無意義。

private void Page_Load(object sender, EventArgs e) 
{ 
    // Check whether the browser remains 
    // connected to the server. 
    if (Response.IsClientConnected) 
    { 
     // If still connected, do work 
     DoWork(); 
    } 
    else 
    { 
     // If the browser is not connected 
     // stop all response processing. 
     Response.End(); 
    } 
} 

請回復您的目標應用服務器堆棧,以便我可以提供更相關的示例。

關於你提到的第二個替代使用XHR發佈客戶端頁面卸載事件服務器,@俄德的有關HTTP請求是無狀態之間的評論是當場上。這是不太可能的,特別是在有多個服務器的農場中。

相關問題