我是否需要在ASP.NET中部署Web服务引用?

时间:2009-01-09 19:58:14

标签: c# asp.net web-services dispose

垃圾收集器是否清理了Web服务引用,或者在调完我调用的任何方法后是否需要在服务引用上调用dispose?

5 个答案:

答案 0 :(得分:23)

您可以使用singleton pattern,而不是担心处理您的网络服务,而只能保留每个网络服务的单个实例。 Web服务是无状态的,因此可以安全地在Web服务器上的连接和线程之间共享。

以下是可用于保存对Web服务实例的引用的Web Service类的示例。这个单例是懒惰和线程安全的。建议如果你使单身人员懒惰,他们也会遵循相同的逻辑保持线程安全。要了解有关如何执行此操作的详细信息,请阅读Implementing Singletons上的C#In Depth文章。

另请注意,您可能会遇到WCF Web服务的问题。我建议您阅读WCF's instance management techniques article,特别是单身人士部分,了解更多详情。

public static class WS
{
    private static object sync = new object();
    private static MyWebService _MyWebServiceInstance;

    public static MyWebService MyWebServiceInstance
    {
        get
        {
            if (_MyWebServiceInstance == null) 
            {
              lock (sync)
              {
                if (_MyWebServiceInstance == null)
                {
                    _MyWebServiceInstance= new MyWebService();
                }
              }
            }
            return _MyWebServiceInstance;
        }
    }
}

然后当您需要访问您的Web服务时,您可以执行以下操作:

WS.MyWebServiceInstance.MyMethod(...)

var ws = WS.MyWebServiceInstance;
ws.MyMethod(...)

我已经在几个项目中成功使用了这种模式并且运行良好,但正如tvanfosson在下面的评论中提到的,更好的策略是使用DI框架来管理您的Web服务实例。

答案 1 :(得分:1)

我认为DataService从Component继承了Dispose。

答案 2 :(得分:1)

实现IDispose的对象应手动处理以协助垃圾收集器。

如果您的对象是短暂的,请使用using块。对于可以保留的对象,确保它们保留的对象在处理它们时将它们处理掉。

答案 3 :(得分:0)

你想在这里完成什么?

如果您担心性能,那么我会更担心托管Web服务的服务器的响应能力和网络速度,因为它们会极大地影响您必须等待Web服务调用完成的时间长度(除非它异步)。

MSDN上的示例不要调用'Dispose',而且很明显垃圾收集器会完成它的工作,所以除非你在每秒需要处理超过100,000条记录的实时系统上工作,否则你可能不需要想出一种处理资源或管理记忆的方法。

答案 4 :(得分:0)

我认为上述回答中 Seabizkit 的担忧是非常合理的。 此处引用:

<块引用>

@DanHerbert 当两个线程调用单例时会发生什么......让我解释一下......对象上有一个锁......以使其线程安全。这是否意味着如果 theard1 调用访问 webInstance,则 thread2 将等待 thread1 完成。或者是纯粹用于创建实例的锁。假设您有 10 个呼叫者.... 锁定是否意味着他们被链接...或异步,我想您会得到我要问的内容,如果不清楚,请告诉我。 – Seabizkit 2016 年 10 月 13 日 10:01 <

在我完成一些测试之后,我可以看出当多个不同的线程使用单个“客户端”对象时,您将无法获得任何良好的性能。 如果创建了 10 个线程并且它们都使用同一个单例“客户端”,那么它们将不得不排队等待,直到所有先前的调用都完成。

要查看证明,请在此处阅读并运行这篇 c-sharp 角文章中的示例: https://www.c-sharpcorner.com/article/increase-performance-with-an-object-pool-or-why-singleton-may-cause-performance/ 标题为“使用对象池提高性能或为什么单例可能会导致性能问题”。

很抱歉打破了单例 Web 服务用户的泡沫。此外,您将很难找到 Microsoft 的示例,其中 Web 服务客户端被“囚禁”在单例中。