2011-06-09 50 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