Приведенный ниже текст является попыткой расширить и добавить цвет к этому вопросу:
Как мне не допустить, чтобы ненадлежащий клиент отказался от обслуживания всего сервиса?
По сути, у меня такой сценарий:служба WCF запущена и работает с обратным вызовом клиента, имеющим прямое, простое одностороннее соединение, не сильно отличающееся от этого:
public interface IMyClientContract
{
[OperationContract(IsOneWay = true)]
void SomethingChanged(simpleObject myObj);
}
Я вызываю этот метод потенциально тысячи раз в секунду изобслуживание до 50 одновременно работающих клиентов с минимально возможной задержкой (было бы неплохо <15 мс).Это работает нормально, пока я не установлю точку останова на <em>одном клиентских приложений, подключенных к серверу, а затем все зависает, возможно, через 2-5 секунд служба зависает, и ни один из других клиентов не получает никаких данных в течение примерно 30секунд или около того, пока служба не зарегистрирует событие сбоя соединения и не отключит клиент, который нарушил работу.После этого все остальные клиенты продолжают веселиться, получая сообщения.
Я провел исследование по обслуживанию Throttling, настройке параллелизма, настройке минимальных потоков потоков, секретных соусов WCF и целых 9 ярдов, но в концедень, когда эта статья MSDN - основы WCF, односторонние вызовы, обратные вызовы и события точно описывает проблему, с которой я сталкиваюсь, но не вынесла рекомендации.
Третье решение, котороепозволяет службе безопасно перезванивать клиенту, если контрактные операции обратного вызова настроены как односторонние операции.Это позволяет службе перезванивать, даже если для параллелизма задан однопоточный режим, потому что не будет никакого ответного сообщения, которое будет бороться за блокировку.
, но ранее в этой статье описана проблемаЯ вижу, только с точки зрения клиента
Когда однонаправленные вызовы достигают службы, они могут отправляться не сразу и могут быть поставлены в очередь на стороне службы для отправки по одномувремя, все в соответствии с настроенным сервисом поведением режима параллелизма и режимом сеанса.Сколько сообщений (односторонних или запросов-ответов) служба готова поставить в очередь, является продуктом настроенного канала и режима надежности.Если количество сообщений в очереди превысило емкость очереди, то клиент заблокирует даже при отправке одностороннего вызова
Я могу только предположить, что обратное значение истинно, количество сообщений в очередичтобы клиент превысил емкость очереди, и пул потоков теперь заполнен потоками, пытающимися вызвать этого клиента, которые теперь все заблокированы.
Каков правильный способ справиться с этим?Должен ли я найти способ проверить, сколько сообщений находится в очереди на служебном коммуникационном уровне для каждого клиента, и прервать их соединения после достижения определенного предела?
Почти кажется, что если сама служба WCF блокирует заполнение очереди, то все стратегии async / oneway / fire-and-Forgot, которые я когда-либо мог реализовать в службе, будут блокироваться всякий раз, когда очередь одного клиентанаполняется.