2011-06-09 44 views
4

我有一個通用處理程序(.ashx)頁面,它接收來自提供者的XML文檔。然後,我將該XML文檔發送給第三方進行承保。我等待第三方的迴應,然後將此回覆傳遞給主要提供商。所有這些都在30秒或更短的時間內發生。將響應返回給客戶端後繼續處理

我的問題是,領先供應商將只關閉連接並繼續前進,最多隻能等待30秒。我試圖啓動一個內部計時器,如果我沒有收到第三方承銷商的回覆,請將回復發送給主要提供商。這一切工作正常。

我想要做的是將回復發送給主要提供商,但繼續等待第三方承保人的回覆。他們會把它交給我們......但有時可能需要幾分鐘。

我已經嘗試了所有我已經得到了,這樣做的

Response.Flush(); 
Response.Close(); 
Response.End(); 
context.ApplicationInstance.CompleteRequest(); 

組合的種種是一個)拋出約線程錯誤被中止,或「無法因爲代碼是計算表達式優化的或本地框架位於調用堆棧之上「,或者b)客戶端認爲請求被終止並且它從未收到響應。

我不能實現一個隊列類型的體系結構,而不需要重新編寫大部分邏輯,即使這樣我也不想這樣做,因爲它會增加響應的處理時間。

有什麼建議嗎?看起來.Close()和.End()並不意味着我認爲它們是如何工作的,我不知道應該用什麼來代替。

回答

3

也許System.Threading.ThreadPool.QueueUserWorkitem()可以幫到你嗎?

這個想法是對一個只要線程池中的線程空閒就運行的操作進行排隊。

public class Data { 
    public int ID {get; set; } 
    public string OtherData { get; set; }  
} 

public override void ProcessRequest(HttpContext context) 
{ 
    var workLoad = new Data { 
     ID = int.Parse(context.Request.Params["ID"]), 
     OtherData = context.Request.Params["OtherData"] 
    }; 
    // somewhere before the end : 
    ThreadPool.QueueUserWorkItem(new WaitCallback(LongRunningMethod), workLoad); 

    Response.Flush(); 
    Response.Close(); 
} 

public void LongRunningMethod(object state) 
{ 
    var data = (Data)state; 
    CalculateTheOriginOfTheLife(data.ID, data.OtherData); 
} 
+0

我不知道這將如何幫助。我需要等第三方承銷商的迴應,至少有一段時間。但無論我做什麼,我都無法讓IIS實際返回響應,因爲它現在已經寫好了。它總是等到線程死亡。我不確定你的解決方案如何幫助我,但也許我錯過了一些東西。 – 2011-06-09 19:36:29

+0

不確定要了解你的需要。你說過「我想要做的就是將回復發送給主要提供商,但要繼續等待第三方承銷商的迴應。」你想對結果做什麼? – 2011-06-09 19:39:16

+0

我會得到響應並將其存儲在數據庫中。但是如果我在另一個線程上啓動另一個方法,我將如何收到響應?我已經有了一個HttpWebRequest對象......我不能只在線程的某個地方存儲它,對嗎? – 2011-06-09 19:48:12

相關問題