Повторное использование клиентов службы WCF

У меня есть веб-сервис WCF, который действует как поставщик данных для моей веб-страницы ASP.NET.

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

В настоящее время я создаю новый ServiceClient и открываю его для каждого запроса, а именно: "Получить пользователей, получить роли, получить список клиентов и т.д.". Каждый из них создаст новый ServiceClient и откроет новое соединение.

Могу ли я сделать класс ServiceClient глобальным или статически доступным классом, чтобы все функции на моей веб-странице ASP.NET могли использовать одного и того же клиента. Казалось бы, это намного эффективнее. Есть ли проблемы с этим? Любые советы, которые я должен учитывать при этом?

Что произойдет, если я сделаю несколько запросов клиенту? Предположительно, это все синхронно, поэтому не имеет значения, могу ли я сделать 1 или 50 вызовов?

Спасибо

Ответ 1

При использовании сеанса (wsHttp с контекстом безопасности или надежным сеансом) или привязкой к соединению (net.tcp, net.pipe) вы должны обрабатывать свой прокси-сервер так, как вы хотите обрабатывать сеанс. Поэтому, если вы используете прокси-сервер, все вызовы будут обрабатываться в одном сеансе WCF (по умолчанию обрабатывается экземпляром одной службы). Но вам придется иметь дело с дополнительной сложностью, например: исключение необработанной службы прекратит ваш канал, а следующий вызов от клиента приведет к исключению.

Если используется привязка HTTP без привязки к сеансу (basicHttp, webHttp), вы можете поделиться своим прокси-сервером или даже сделать его статическим. Каждый вызов обрабатывается отдельно, исключение в службе не будет повреждать канал, и он прозрачно повторно использует открытые HTTP-постоянные соединения. Но из-за этого не должно быть больших накладных расходов на создание нового прокси-канала.

Итак, мое предложение: когда вам нужно несколько вызовов вашей услуги при обработке одного запроса в вашем приложении ASP.NET, используйте тот же прокси-канал. Но не разделяйте прокси-канал между различными запросами.

Ответ 2

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

Подробнее здесь: ChannelFactory

Для обработки каналов вам нужна специальная обработка, так как канал может вызывать исключение в распоряжении. Я написал обработчик, чтобы справиться с этим, вы можете прочитать об этом здесь: http://blog.tomasjansson.com/2010/12/disposible-wcf-client-wrapper/