2012-11-18 27 views
2

我使用異步XMLHttpRequest來調用ASP.net web服務中的函數。
當我在XMLHttpRequest上調用abort方法時,服務器收到請求並處理它後,服務器繼續處理請求。
有沒有辦法停止服務器上的請求處理?在asp.net上處理XMLHttpRequest中止

回答

3

一般來說,不可以,一旦服務器啓動,您就無法停止正在處理的請求。畢竟,服務器如何知道請求何時被中止?

這就像是你導航到一個網頁,但在第一個加載之前瀏覽到另一個網頁。最初的要求至少在某種程度上(任何客戶端工作當然不會發生)都會得到滿足。

如果您確實希望停止服務器上的長時間運行操作,則需要調用正在調用的服務,以便它可以支持被中斷。一些僞代碼:

void MyLongRunningMethod(opId, args) 
{ 
    work = GetWork(args) 

    foreach(workItem in work) 
    { 
     DoWork(workItem) 

     //Has this invocation been aborted? 
     if(LookUpSet.Contains(opId)) 
     { 
      LookUpSet.Remove(opId) 
      return 
     } 
     //Or try this: 
     if(Response.IsClientConnected) 
     { 
      HttpContext.Current.Response.End(); 
      return; 
     } 
    } 
} 

void AbortOperation(opId) 
{ 
    LookUpSet[opId] = true 
} 

所以這裏的想法是,MyLongRunningMethod定期檢查,看它是否已被中止,返回如果是這樣。它的目標是opId是唯一的,所以你可以基於當前時間附加的客戶端的會話Id或其他東西(在Javascript中,new Date().getTime()將得到自時代以來的毫秒數)生成它。

通過這種方法,服務器必須保持狀態(在我的示例中爲LookUpSet),因此您需要一些方法來完成此操作,例如數據庫或將其存儲在內存中。該服務還需要進行架構設計,以便中止調用不會使事情處於非工作狀態,這當然非常依賴於它的功能。

另一個非常重要的要求是數據可以分成幾塊並分塊工作。這就是允許服務中斷的原因。

最後,如果某個操作要中止,那麼必須調用AbortOperation - 只需中止XMLHttpRequest調用就不會有幫助,因爲操作將一直持續到完成。

編輯

從這個問題:ASP.Net: How to stop page execution when browser disconnects?

你也可以檢查Response.IsClientConnected屬性,嘗試確定調用是否已經中止。

一般而言,服務器在嘗試向其發送數據之前不會知道客戶端已斷開連接。見Best practice to detect a client disconnection in .NET?Instantly detect client disconnection from server socket

+0

我不明白。 XMLHttpRequest等待來自服務器的響應,這就是在處理請求期間連接沒有終止的原因。當請求被中止時,連接被終止,所以服務器應該知道它。 我錯過了什麼嗎? – Andy

+0

@安迪見我的編輯 –

0

由於nick_w寫道,您無法停止服務器啓動後處理的請求。但有能力實施解決方案,這將使您能夠取消服務器任務。迪諾·埃斯波西託有這樣的事情如何可以實現幾大文章: Canceling Server Tasks with ASP.NET AJAX

而在下面的文章,以實現集中到服務器恐龍埃斯波西託介紹如何使用SignalR庫: Build a Progress Bar with SignalR; Long Polling and SignalR

所以,如果你真的需要取消服務器上的一些任務,這些文章可以作爲實施所需解決方案的起點。