【问题标题】:Are .NET Web Service proxy classes safe to use as Singletons?.NET Web 服务代理类可以安全地用作单例吗?
【发布时间】:2010-05-27 19:04:45
【问题描述】:

我正在使用 Visual Studio 生成的代理类与 SOAP Web 服务进行通信。生成的类派生自 System.Web.Services.Protocols.SoapHttpClientProtocol。我发现类的实例化成本很高,因此我正在考虑修改我的工厂方法以返回该类的 Singleton 实例。根据the documentation,该类对于多线程是安全的。

有没有人有重用这些类的实例的经验?这样做是否有任何负面影响(即连接保持打开状态等)?

.NET 框架版本:2.0

【问题讨论】:

    标签: .net web-services proxy-classes


    【解决方案1】:

    没有理由在单例模式中使用这些类会导致问题,但是我很难理解您要解决的问题。当您说这些类的实例化成本很高时,您将它们与什么进行比较?与向 Web 服务发出 http 请求的成本相比,实例化代理类的成本应该可以忽略不计。您能否解释一下情况/发布一些代码来证明您的性能瓶颈是由实例化代理类引起的。

    【讨论】:

    • 事实证明,实例化的成本是由于从应用程序配置文件中生成的设置加载 Web 服务 URL。这是一次性成本,所以你是对的,不需要重用代理实例。
    【解决方案2】:

    除了开销之外,我可以想象实例化代理单例的多种原因,我同意这不是很多。最大的原因是维护服务调用之间的会话。想象一个应用程序有多个页面,所有页面都使用相同的 Web 服务方法。 Web服务调用的会话通常通过在代理上设置cookie参数来进行:

    proxy.CookieContainer = new System.Net.CookieContainer();
    

    如果您为每个页面操作创建一个新代理,会话将在页面之间丢失。创建一个所有页面都使用的单例代理可以解决这个问题。

    【讨论】:

      猜你喜欢
      • 2011-06-20
      • 1970-01-01
      • 1970-01-01
      • 2011-01-22
      • 2010-09-08
      • 1970-01-01
      • 1970-01-01
      • 2012-05-02
      • 2019-04-27
      相关资源
      最近更新 更多