Справочник по услугам WCF на странице ASP.net - когда утилизировать? - PullRequest
2 голосов
/ 31 августа 2010

У меня есть страница ASP.net, которая создает ссылку на службу WCF и выполняет вызовы в нескольких местах на моей странице.Я создаю экземпляр ссылки на службу в Page_Load и у меня есть переменная экземпляра для ее хранения:

private FooClient _serviceClient;

protected void Page_Load(object sender, EventArgs e)
{
    _serviceClient = nwe FooClient();
    _serviceClient.GetAllFoos();
}

protected void btnSave_Click(object sender, EventArgs e)
{
    _serviceClient.SaveFoo();
}

Я только что обнаружил, что мне нужно избавиться от ссылки на службу, когда я ее использую, иначе соединения будутсохраняется и будет блокировать входящие соединения, если я достигну максимального количества соединений.Где будет лучшее место, чтобы избавиться от этих ссылок?Я думал сделать это на событии OnUnLoad.

Есть ли лучший способ сделать это?

Ответы [ 2 ]

1 голос
/ 31 августа 2010

Лично я бы открыл FooClient, когда мне это нужно, поэтому не в Page_Load, а в методах, которые выполняют вызовы веб-службы. Таким образом, вы точно знаете, что с ним происходит. Я обычно придерживаюсь следующего подхода:

var client = OpenClient();
try
{
    // Perform operation(s) on client.
}
finally
{
    CloseClient(client);
}

Таким образом, вы уверены, что закрываете свой прокси-сервер, что бы ни случилось (если есть исключения, которые вам нужно перехватить, просто добавьте предложение catch). CloseClient метод должен выглядеть так же, как в ответе PaulStack.

Другое преимущество, которое вы получаете, когда вы делаете это, состоит в том, что множественные вызовы не мешают друг другу. Предположим, что один из вызовов веб-службы приводит к неожиданному исключению. Клиентский канал теперь находится в неисправном состоянии и поэтому непригоден для любых других вызовов.

И в-третьих, предположим, что возникает исключение, которое вы не можете перехватить или не хотите перехватить, я не уверен, что Page_Unload действительно вызван (и я не знаю, какой метод страницы будет вызван в этом событии ). Это также оставит соединения открытыми.

0 голосов
/ 31 августа 2010

в соответствии с документацией MSDN и личным опытом выполните следующие действия:

 try
{
    ...
    client.Close();
}
catch (CommunicationException e)
{
    ...
    client.Abort();
}
catch (TimeoutException e)
{
    ...
    client.Abort();
}
catch (Exception e)
{
    ...
    client.Abort();
    throw;
}

это позволит правильно закрывать или прерывать службу при необходимости, а не оставлять их для утилизации в заранее установленное время - оставляйте соединение открытым только столько, сколько вам необходимо. лично мне не нравится наследовать от IDisposable, так как он очень тяжелый по производительности

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...