Повторное использование клиентов службы WCF - PullRequest
12 голосов
/ 10 января 2011

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

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

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

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

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

Спасибо

Ответы [ 2 ]

8 голосов
/ 10 января 2011

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

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

Поэтому я предлагаю следующее: если вам нужно несколько вызовов к вашей службе для обработки одного запроса в приложении ASP.NET, используйте один и тот же прокси / канал. Но не делитесь прокси / каналом среди разных запросов.

1 голос
/ 10 января 2011

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

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

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

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