【问题标题】:SOAP Web Service on ASP.NET - Multiple Connection - Static Values - XMLRPC APIASP.NET 上的 SOAP Web 服务 - 多连接 - 静态值 - XMLRPC API
【发布时间】:2011-06-09 22:09:27
【问题描述】:

拥有一个 SOAP Web 服务,它封装了对第 3 方 API 的调用...所以我们的应用程序可以简单地调用我的服务,然后我的服务会处理对 API 的所有各种调用。效果很好。

但是,我们遇到了一个问题,即我们要连接的 API 在任何给定时间最多允许对一组给定凭据进行 10 个连接。

连接最多需要几秒钟的时间来处理,但是当我们上线时,理论上我们可以让用户最大限度地利用这一点。因此,我们为 API 创建了多个帐户 (5),为 5 个用户提供了 50 个连接。

ASP.NET 如何处理与 Web 服务的连接?我知道它是异步工​​作的,但它会产生我的类的多个实例还是重用同一个类。变量是否会跨实例持续存在(即静态变量是否有效)?

我需要做的是,如果在 Client1 上调用 API 失败、翻转到 Client2(或 Clients[0]、Clients[1])等...遗憾的是,我无法检测给定的 Client 是否是在任何给定时刻失去联系。我可以通过测试调用来轮询它,但这需要时间并且不能保证在我进行调用时客户端有可用的连接。

我调用的 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() 拨打电话,然后建立连接。

【问题讨论】:

    标签: asp.net web-services soap asmx xml-rpc


    【解决方案1】:

    如果您使用的是 ASP.NET Web 服务 (asmx),那么它会为每个请求生成一个新的 Web 服务类实例。在基于 WCF 的 Web 服务的情况下,您可以使用属性/配置控制实例化/并发(请参阅此 article) - 您可以使用三种实例化模式 - 每个调用、每个会话和单例。

    无论您使用什么,您始终可以实现自己的池化机制来池化您的 API 连接。您已经有一个工厂方法来获取 API 客户端 - 只需在方法中调用池化层。

    【讨论】:

    • 但是我如何确定我是否需要另一个客户端与我已经拥有的连接/凭据?
    • @pieklk,抱歉回复晚了(我不在站)。本质上,池化机制通常具有阈值,即可能的最大连接数。在您的情况下,您的池设计会有点复杂,因为您还想拥有多个凭据。因此,您的设计必须查看凭证的最大连接阈值是否已用尽。如果没有,则为该凭据创建连接。如果是,则转到下一个凭据。如果你没有剩下的,那就等到有一个可用。在下一条评论中继续...
    • 有点简单的实现方法是创建一个包含所有可用插槽的池(凭据数 x 每个凭据的最大连接数)。当请求连接时分配一个插槽,将插槽标记为“已填充”(并创建实际的 API 客户端等)。每当您完成连接时,通知您的池化层,它会再次将插槽标记为空闲。您可以将此逻辑放入 API 客户端的关闭/处置中(通过包装它或者如果它的部分类然后向其添加逻辑)。
    【解决方案2】:

    通常 Windows XP 和 Windows 7 有 10 个并发 TCP/IP 连接的限制。也许就是这样。请务必在 windows 服务器版本中工作。

    【讨论】:

    • -1:OP 说“我们要连接的 API 在任何给定时间允许最多 10 个连接用于给定的一组凭据。”
    猜你喜欢
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    相关资源
    最近更新 更多