2011-06-09 39 views
0

有一個將Web服務封裝到第三方API的調用...因此,我們的應用程序可以簡單地調用我的服務,然後我的服務處理所有對API的各種調用。工作得很好。ASP.NET上的SOAP Web服務 - 多重連接 - 靜態值 - XMLRPC API

但是,我們遇到了一個問題,即我們要連接的API允許在給定的一組憑證的任何給定時間最多連接10個連接。

連接最多需要幾秒鐘的時間來處理,但是當我們開始工作時,理論上我們可以有最大限度地滿足這個需求的用戶。所以我們爲這個API創建了多個賬戶(5),爲5個用戶提供了50個連接。

ASP.NET如何處理與Web服務的連接?我知道它異步工作,但它產生了我的類的多個實例或重用相同的類。變量是否會在實例間持續存在(即Will靜態變量是否有效)?

我需要做的是,如果一個API的調用在Client1上失敗,會翻轉到Client2(或Clients [0],Clients [1])等等......可悲的是我無法檢測給定的客戶端在任何特定時刻都沒有連接。我可以用測試呼叫輪詢它,但這需要時間,並且不能保證客戶端在我打電話時有可用的連接。

我打電話給的API是通過XMLRPC代理類(CookComputing)。客戶端創建時或撥打電話時是否建立「連接」,傳遞憑證?

public static IVoicestar GetClient(string userID, string password) 
{ 
    IVoicestar client = XmlRpcProxyGen.Create<IVoicestar>(); 
    client.Credentials = new NetworkCredential(userID, password); 
    return client; 
} 

從該的憑據只是「一起乘坐」我使通過Client.MethodCall()的調用,然後連接而成看起來。

回答

1

如果您使用的是ASP.NET Web服務(asmx),那麼它會爲每個請求產生一個新的Web服務類實例。在基於WCF的Web服務的情況下,您可以使用屬性/配置來控制實例化/併發性(請參閱article) - 您有三種實例化模式 - 每次調用,每個會話和單例。

無論您使用什麼,您都可以實現自己的池機制來共享您的API連接。您已經有了一個工廠方法來獲取API客戶端 - 只需在方法內調用pooling圖層即可。

+0

但是我如何確定是否需要另一個客戶端與我已有的連接/憑證? – klkitchens 2011-06-10 11:08:23

+1

@ pieklk,很抱歉回覆晚了(我離開了車站)。基本上,池化機制通常具有閾值即可能的最大連接。在你的情況下,你的游泳池設計會有點複雜,因爲你想擁有多個憑證以及。因此,您的設計必須查看是否用盡了最大連接閾值。如果沒有,則爲該憑證創建連接。如果是,則轉到下一個憑證。如果你沒有剩下任何東西,那就等到一個可用。接下來的評論繼續... – VinayC 2011-06-16 05:11:05

+1

有點簡單的實現方法將創建一個所有可用插槽的池(沒有證書x沒有最大連接每個憑據)。在請求連接時分配一個插槽,將插槽標記爲「填充」(並創建實際的API客戶端等)。每當您完成連接時,請通知您的連接層,並再次將該插槽標記爲空閒。你可以把這個邏輯關閉/處理你的API客戶端(通過包裝它,或者如果它的部分類然後添加邏輯)。 – VinayC 2011-06-16 05:14:32

-1

通常,Windows XP和Windows 7有10個併發TCP/IP連接的限制。也許就是這樣。一定要在Windows服務器版本中工作。

+1

-1:OP表示「我們連接的API允許在給定時間內任何給定時間最多有10個連接。」 – 2012-03-13 23:26:48