asp.net Web服务OnUnload?

asp.net Web服务OnUnload?,asp.net,web-services,dispose,sqlconnection,Asp.net,Web Services,Dispose,Sqlconnection,我正在创建一个web服务,它有许多方法,所有这些方法都使用SqlConnection。我声明一个类级连接并在web服务构造函数中初始化它似乎是合乎逻辑的 问题是当web服务调用完成时,我找不到一个确定的方法来释放连接,所以我有一个连接泄漏。我尝试过重写Dipose()方法,但没有在合理的时间范围内调用它(实际上在我的测试中根本没有)。为了更好地衡量,我还尝试将处理程序附加到Disposed()事件,但正如预期的一样,出现了相同的问题 web服务类没有类似于Page.OnUnload的东西吗?似乎

我正在创建一个web服务,它有许多方法,所有这些方法都使用SqlConnection。我声明一个类级连接并在web服务构造函数中初始化它似乎是合乎逻辑的

问题是当web服务调用完成时,我找不到一个确定的方法来释放连接,所以我有一个连接泄漏。我尝试过重写Dipose()方法,但没有在合理的时间范围内调用它(实际上在我的测试中根本没有)。为了更好地衡量,我还尝试将处理程序附加到Disposed()事件,但正如预期的一样,出现了相同的问题

web服务类没有类似于Page.OnUnload的东西吗?似乎很难相信我必须在每种方法中建立单独的联系

有什么建议吗

我声明一个类级连接并在web服务构造函数中初始化它似乎是合乎逻辑的

不,这看起来根本不符合逻辑。ADO.NET使用的是一个函数,因此您不需要这样做。此连接池是每个应用程序域的每个连接字符串

因此,您只需在每个web方法中从池中绘制一个新连接,并在最后将其返回到池中(使用语句的
将处理此问题):

所以这里有一个建议:不要试图通过使用一些类字段、静态字段等手动管理连接。。。将此管理留给ADO.NET,因为它做得更好

备注:我展示的代码通常驻留在由web方法调用的数据访问层中

我声明一个类级连接并在web服务构造函数中初始化它似乎是合乎逻辑的

不,这看起来根本不符合逻辑。ADO.NET使用的是一个函数,因此您不需要这样做。此连接池是每个应用程序域的每个连接字符串

因此,您只需在每个web方法中从池中绘制一个新连接,并在最后将其返回到池中(使用
语句的
将处理此问题):

所以这里有一个建议:不要试图通过使用一些类字段、静态字段等手动管理连接。。。将此管理留给ADO.NET,因为它做得更好


备注:我展示的代码通常驻留在由web方法调用的数据访问层中。

谢谢Darin,但这实际上是我试图避免的,即必须用using{}块装饰每个方法。我了解连接池是如何工作的,我要说的是减少webservice类中的代码开销。因为每个方法都需要使用连接对象,所以我希望将声明放在类级别的一个位置,并使用构造函数/析构函数(这就是我所说的逻辑)。您所描述的是我目前正在使用的,我希望有一种更简洁的方式。我应该详细说明一下——我假设一个webservice类对于每个方法调用和每个线程都实例化一次。我想要达到的目标将取决于那是真的。如果这不是真的,那么你的例子是唯一的方法。谢谢Darin,但这实际上是我试图避免的,即必须用using{}块来装饰每个方法。我了解连接池是如何工作的,我要说的是减少webservice类中的代码开销。因为每个方法都需要使用连接对象,所以我希望将声明放在类级别的一个位置,并使用构造函数/析构函数(这就是我所说的逻辑)。您所描述的是我目前正在使用的,我希望有一种更简洁的方式。我应该详细说明一下——我假设一个webservice类对于每个方法调用和每个线程都实例化一次。我想要达到的目标将取决于那是真的。如果这不是真的,那么你的例子是唯一的方法。
[WebMethod]
public void Foo()
{
    // Here you are NOT creating a new connection to the database
    // you are just drawing one from the connection pool
    using (var conn = new SqlConnection(SomeConnectionString))
    using (var cmd = conn.CreateCommand())
    {
        // Here you are NOT opening a new connection to the database
        conn.Open();
        cmd.CommandText = "SELECT id FROM foo";
        using (var reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                // do something with the results
            }
        }
    } // Here you are NOT closing the connection, you are just returning it to the pool
}