asp.net веб-сервис OnUnload? - PullRequest
0 голосов
/ 13 февраля 2011

Я создаю веб-сервис, который имеет несколько методов, каждый из которых использует SqlConnection.Кажется логичным, что я объявил бы соединение уровня класса и инициализировал бы его в конструкторе веб-службы.

Проблема в том, что я не могу найти окончательный способ освободить соединение, когда вызов веб-службы завершается, поэтому у меня есть соединениепротечь.Я попытался переопределить метод Dipose (), но он не вызывается в разумные сроки (на самом деле совсем не в моем тестировании).В качестве примера я также попытался присоединить обработчик к событию Disposed (), но, как и ожидалось, та же проблема.

Нет ли ничего похожего на Page.OnUnload для классов веб-служб?Кажется, трудно поверить, что мне пришлось бы устанавливать отдельную связь в каждом отдельном методе.

Есть предложения?

1 Ответ

3 голосов
/ 13 февраля 2011

Кажется логичным, что я объявил бы соединение уровня класса и инициализировал бы его в конструкторе веб-сервиса.

Нет, это не кажется логичным. ADO.NET использует пул соединений , поэтому вам не нужно этого делать. Этот пул соединений для каждой строки соединения для домена приложения.

Таким образом, вы можете просто нарисовать новое соединение из пула в каждом веб-методе и вернуть его в пул в конце (операторы using позаботятся об этом):

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

Итак, вот совет: не пытайтесь управлять соединениями вручную, используя некоторые поля классов, статические поля, ... Оставьте это управление ADO.NET, так как оно лучше.

Примечание: код, который я показал, обычно находится на уровне доступа к данным, который вызывается веб-методом.

...