Как я могу заставить WCF автоматически закрывать соединения? - PullRequest
4 голосов
/ 05 июня 2009

Когда я создаю приложение WCF с использованием встроенных шаблонов Visual Studio и пытаюсь вызвать его в цикле, проходит только 5 запросов. Служба перестает отвечать на запросы. Единственный способ обойти это - это закрывать соединения после каждого звонка.

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

Есть ли способ получить такое же поведение с WCF?

Вот мой конфиг

<system.serviceModel>
    <services>
      <service name="WorkflowLibrary1.Workflow1" behaviorConfiguration="WorkflowLibrary1.Workflow1.Service1Behavior">
        <endpoint address="" binding="wsHttpContextBinding" contract="WcfServiceLibrary1.IService1"/>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="WorkflowLibrary1.Workflow1.Service1Behavior">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

Ответы [ 3 ]

2 голосов
/ 06 августа 2010
  1. Сначала прочтите это -> Как избежать проблем с оператором использования: http://msdn.microsoft.com/en-us/library/aa355056.aspx

  2. Если вы хотите более надежное решение, чем предусмотрено по ссылке выше, я рекомендую следующее: http://bloggingabout.net/blogs/erwyn/archive/2006/12/09/WCF-Service-Proxy-Helper.aspx (код) http://bloggingabout.net/blogs/erwyn/archive/2007/01/30/usage-of-the-wcf-serviceproxyhelper.aspx (использование / образцы)

Voila!

1 голос
/ 24 июня 2010

Также взгляните на WCF Dynamic Client Proxy . Он будет автоматически очищен после вашего прокси.

1 голос
/ 05 июня 2009

5 подключений, вероятно, исходят от сервера - вы можете определить количество максимальных открытых сеансов, максимальное количество одновременных вызовов и максимальное количество экземпляров сервера с помощью поведения серверов serviceThrottling.

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

Я бы предложил включить использование вашего клиентского прокси в оператор using следующим образом:

using(ClientProxy proxy = new ClientProxy())
{
   // go ahead, call your service methods
}

Обновление: , как правильно заметил комментатор, у него есть свои проблемы, так как клиент может выбросить исключение при удалении. Так что это может не очень хорошо работать - или вам нужно обернуть try...catch вокруг него для обработки тех случаев, когда закрытие клиентского прокси вызывает проблему.

См. Как избежать проблем с помощью оператора Using


Таким образом, клиентский прокси автоматически закрывается и удаляется, когда заканчивается область использования блока, и ваш канал от клиента к серверу освобождается, и сервер готов принять другой вызов от другого клиента.

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

Марк

...