Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Do I need to dispose a web service reference in ASP.NET?

Does the garbage collector clean up web service references or do I need to call dispose on the service reference after I'm finished calling whatever method I call?

like image 943
BeaverProj Avatar asked Jan 09 '09 19:01

BeaverProj


3 Answers

Instead of worrying about disposing your web services, you could keep only a single instance of each web service, using a singleton pattern. Web services are stateless, so they can safely be shared between connections and threads on a web server.

Here is an example of a Web Service class you can use to hold references to your web service instances. This singleton is lazy and thread-safe. It is advised that if you make your singletons lazy, they are also kept thread safe by following the same logic. To learn more about how to do this, read the C# In Depth article on Implementing Singletons.

Also keep in mind that you may run into issues with WCF web services. I'd recommend reading up on WCF's instance management techniques article, specifically the singleton section, for more details.

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;
        }
    }
}

And then when you need to access your web service, you can do this:

WS.MyWebServiceInstance.MyMethod(...)

or

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

I've successfully used this pattern on several projects and it has worked well, but as tvanfosson mentions in the comments below, an even better strategy would be to use a DI framework to manage your web service instances.

like image 144
Dan Herbert Avatar answered Oct 20 '22 13:10

Dan Herbert


I think the DataService inherits Dispose from Component.

like image 1
BeaverProj Avatar answered Oct 20 '22 14:10

BeaverProj


Objects that implement IDispose should be disposed of manually to assist the garbage collector.

If you object is short lived use a using block. For objects that can be retained ensure that they object that retains them disposes of them when it is also disposed.

like image 1
orj Avatar answered Oct 20 '22 14:10

orj