Соединения WCF, превышающие максимальное число соединений при использовании асинхронного шаблона - PullRequest
6 голосов
/ 01 октября 2010

У меня есть простой сервис WCF, с которым я общаюсь асинхронно.

Мне не нравится, когда я вызываю EndServiceMethod(IASyncResult)

, если я забыл вызвать Close() метод, служба фактически оставит соединение открытым, а затем все оставшиеся соединения потерпят неудачу после того, как wcf достигнет максимального числа одновременных соединений с исключениями тайм-аута.

Я пытался использовать атрибут [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)] для контракта на обслуживание, который, по-видимому, не влияет на состояние соединения со службой.

Возможно, я неправильно это реализовал?

Любые идеи или предложения.

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

Ответы [ 5 ]

4 голосов
/ 02 октября 2010

Это на самом деле сложная проблема.

С одной стороны, если вы не закроете соединение, оно останется открытым до истечения времени ожидания (1 мин), при нагрузке вы достигнете максимального количества соединений (по умолчанию 10).

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

Есть несколько вещей, которые вы можете попробовать:

  • увеличение макс. Соединения
  • закрыть соединение в обработчике обратного вызова
  • уменьшить продолжительность тайм-аута
1 голос
/ 22 декабря 2011

Указывает механизм регулирования службы Windows Communication Foundation (WCF).

http://msdn.microsoft.com/en-us/library/ms731379%28v=VS.90%29.aspx

0 голосов
/ 02 октября 2010

Я бы не использовал Асинхронный шаблон с WCF. Вместо этого я просто использовал бы синхронные вызовы с обычным использованием блоков, чтобы гарантировать, что соединение закрыто. Затем я бы обернул весь беспорядок в обычный рабочий элемент Task (.NET 4.0) или ThreadPool.

0 голосов
/ 02 октября 2010

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

0 голосов
/ 02 октября 2010

Не знаю, поможет ли это:

Вы можете установить привязку так, чтобы

  • Защита была установлена ​​на нет
  • Надежные сеансыотключены

        <wsHttpBinding>
            <binding name="MyWsHttpBinding">
                <reliableSession enabled="false"/> 
                <security mode="None" />
            </binding>
        </wsHttpBinding>
    

Я обнаружил, что, делая это, я могу открыть неограниченное количество каналов и «забыть» закрыть их.

Тогда у вас естьспросить, является ли это приемлемой конфигурацией для ваших обстоятельств.

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