2013-01-24 53 views
0

我在c#MVC項目中使用了臭名昭着的不可靠SOAP Web服務。我無法控制該服務。它偶爾會停止響應很長時間。從客戶端,有一種簡單的方法可以在設定的時間間隔內繼續重試發送消息,直到我收到來自服務的響應爲止?如何確保將消息傳遞到SOAP端點?

我看過MSMQ和ws-reliability,但是,在我看來,這兩個選項都需要對Web服務進行一些控制。有沒有什麼可以幫助我從客戶端做到這一點?

回答

3

正如你可能已經想通了,你的問題是一個很大的問題。查找「idempotent」和「webservice」。冪等性意味着更多的不僅僅是確保一個請求/響應,而是一次搜索會給你很多好東西閱讀。

如果「停止響應延長的時間」意味着幾秒鐘而很少被調用,DarkWanderer展示了一個非常蠻力的解決方案來解決這個問題。

但是,如果你有很多電話,睡覺可能會吃掉你的工作線程,那麼你只需要依賴某種隊列。

如果您的呼叫是非交易型和非關鍵型的,那麼您肯定可以編碼您自己的排隊機制。雖然這看起來很簡單,但它可能仍然需要線程,複雜的回調,日誌記錄,主動錯誤處理以及哪些不是。許多可憐的靈魂報告說,開始是一個簡單的解決方案,變成了維護的噩夢。

現在我看到您的一個要求是它必須在應用程序池回收中倖存下來。然後,我們處於最後一類關鍵(也許是事務性)排隊。

爲什麼我會從一開始就推薦MSMQ。它可以處理你所有的問題,並且api現在在.net中並且非常好。是的,這會增加您的整體解決方案的複雜性,但這源於您的問題域。

+0

我不反感MSMQ,但我* ahem *刪除的所有內容均將隊列引用到MSMQ中的隊列中。你能指點我一個教程或是指向正確方向的東西嗎? – atevans

+0

有很多來源可供選擇。由於我不知道如何以及爲什麼要調用該web服務的具體細節,因此有很多選項。但基本上你的輸入請求應該在隊列中放置一條消息。然後你可以看到該消息的調用部分,如果成功則將其從隊列中移除。然後啓動檢查,消耗隊列並確保所有服務調用都已完成。這是一個非常基礎的架構。 –

+0

我仍然需要監視隊列的外部服務,對吧?我的理解是,MSMQ無法激活外部代碼。 – atevans

1
while (true) { 
    try { 
     var response = webServiceClient.CallMethod(); 
     if (response.Successful()) 
      break; 
     Sleep(retryInterval); 
    } catch {} 
} 

,這意味着,你只需要保持調用Web服務,無需消息隊列或東西。這是否回答你的問題?

+0

好的,我沒有添加我從Web應用程序調用。在成功之前,應用程序池可能會回收。用那條重要信息更新我的問題。 – atevans

+0

然後,您需要一個簡單的中間服務,然後用作消息隊列。自己編寫的一個比MSMQ實現起來更快,並且不需要更改服務器。 – DarkWanderer