Клиент WCF Silverlight получает ответ 404 not found на сообщение опроса

В конце концов дуплексный клиент WCF Silverlight 4 начинает получать 404 Not Found ошибки для сообщений опроса сразу после того, как опрос был отправлен из службы WCF клиенту Silverlight, иногда это происходит для второго опроса, иногда подключение работает часами или даже днями, но в основном не удается в первые минуты.

! И что интересно, проблема похожа на известную ошибку Silverlight 4 при использовании режима MaxMessagesPerPollduplex, и решение описано здесь и здесь, но я использую SingleMessagePerPoll режим. В любом случае я пробовал использовать ClientStack, как предлагалось, но ничего не изменилось.

Общий поток:

  1. Клиент SL выполняет метод службы WCF, получил ответ
  2. Затем немедленно клиент SL начинает отправлять сообщения опроса в службу, а затем получает исключение для второго или N-s сообщения опроса
    # P4 #
  3. Fiddler показывает только пустой ответ 404 на сообщение опроса
  4. Затем возникло событие "Ошибка канала клиента".

Я пытаюсь повторно подключить SL-клиент после такой ошибки, один поток повторных попыток повторного подключения:

  1. Обработка события Faulted
  2. Отменить подписку на все события канала, такие как Closed/Closing/Opened/Opening
  3. Правильно закройте канал, используя try { close } catch { abort }
  4. Все ниже в новой ветке опроса: (Я обнаружил, что это работает немного стабильно - см. эту статью)
  5. Подождите 45-70 секунд
  6. Используя тот же экземпляр DuplexChannelFactory<T>, создайте новый канал, подпишитесь на все события канала только для целей регистрации
  7. Выполнить метод службы WCF

После 1-10 попыток (~ 1-10 минут) клиент в конце концов подключается к серверу и продолжает нормальный опрос.

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

Главная информация:

  • .NET Framework 4.0
  • PollingDuplex
  • Асинхронные методы WCF
  • Служба WCF, размещенная в IIS 6.0
  • Silverligth 4 клиент
  • Клиентская ОС: Windows XP SP2
  • Серверная ОС: Windows 2003 R2 SP2
  • NTLM аутентификация
  • DuplexMode: SingleMessagePerPoll
  • Существует другая служба WCF, которая выполняет запрос / ответ до того, как моя служба начнет работать, она не использует дуплексное соединение.
  • В клиентской службе SL я регистрирую все в пользовательском интерфейсе, чтобы видеть весь поток событий и иметь время для каждого конкретного события.
  • Нет ошибок в журналах IIS, журналах событий сервера

Клиент:

var binaryBinding = new BinaryMessageEncodingBindingElement();
binaryBinding.ReaderQuotas.MaxStringContentLength = int.MaxValue;

var httpbindingElement = new HttpTransportBindingElement
{
    MaxReceivedMessageSize = 131072
};

var pollingDuplexBindingElement = new PollingDuplexBindingElement
{
    ClientPollTimeout = new TimeSpan(0, 0, 1, 30),
    InactivityTimeout = new TimeSpan(0, 8, 0, 0),
};


_binding = new CustomBinding(
           pollingDuplexBindingElement,
           binaryBinding,
           httpbindingElement)
       {
           SendTimeout = new TimeSpan(0, 0, 0, 45),
           CloseTimeout = new TimeSpan(0, 0, 0, 25),
           ReceiveTimeout = new TimeSpan(0, 8, 0, 0),
           OpenTimeout = new TimeSpan(0, 0, 0, 45)
       };


httpbindingElement.AuthenticationScheme = AuthenticationSchemes.Negotiate;
var endpoint = new EndpointAddress(_endpointAddress);
_channelFactory = new DuplexChannelFactory<TWebService>(
                       new InstanceContext(instanceOfClientServiceClass), 
                       _binding, 
                       endpoint);


// then this factory used to create a new channels
// Also for a new channel I'm setting OpTimeout
var contextChannel = newChannel as IContextChannel;
if (contextChannel != null)
{
   contextChannel.OperationTimeout = TimeSpan.FromSeconds(45);
}

Сервер:

  • WCF, PerSession, многопоточный
  • Все потокобезопасно
  • Никаких исключений серверной службы во время выполнения
  • Много журналов, поэтому я вижу, что происходит в сервисе
  • Все трассировки WCF включены с помощью switchValue All, ничего подозрительного
<binding name="customName"
             sendTimeout="00:01:00"
             receiveTimeout="08:00:00"
             openTimeout="00:01:00"
             closeTimeout="00:00:35">
     <pollingDuplex
         inactivityTimeout="08:00:00"
         serverPollTimeout="00:01:00" />
         <binaryMessageEncoding />
           <httpTransport authenticationScheme="Ntlm"
                          maxReceivedMessageSize="131072">              
         </httpTransport>
</binding>

<behavior name="customBehavior">
        <dataContractSerializer maxItemsInObjectGraph="2147483647" />
        <serviceDebug includeExceptionDetailInFaults="true" />
        <serviceThrottling
             maxConcurrentCalls = "500"
             maxConcurrentSessions = "500"
             maxConcurrentInstances = "500" />
</behavior>

person Community    schedule 12.12.2012    source источник
comment
Проверьте stackoverflow.com/questions/1521117/wcf-over- ssl-404-error   -  person Kamran Shahid    schedule 21.12.2012
comment
Спасибо, но, похоже, не в моем случае, я не использую SSL и myservice иногда работает без 404 в течение нескольких дней, но иногда не может нормально работать даже 10 минут   -  person sll    schedule 21.12.2012


Ответы (2)


Если кажется, что все работает нормально, возможно, это проблема с сетевой инфраструктурой / конфигурацией (например, конфигурация DNS). Возникает ли у вас такая же проблема при локальном запуске или использовании IP-адреса вместо имени хоста?

Аналогичная проблема может также возникнуть, если у вас есть несколько привязок, настроенных на сайте в IIS (подробности см. Здесь: http://blogs.msdn.com/b/rampo/archive/2008/02/11/how-can-wcf-support-multiple-iis-binding-specified-per-site.aspx)

Другое дело, как вы общаетесь от сервера к клиентам. Если вы выполняете итерацию клиентов в цикле и вызываете методы обратного вызова один за другим, вы можете получить таймауты, которые будут отображаться как 404. Обратный вызов обычно следует вызывать в фоновых потоках (по одному на клиента).

В зависимости от того, как вы осуществляете коммуникацию, это также может быть вызвано тупиковой ситуацией (когда поток пользовательского интерфейса участвует в отправке / получении сообщений / обратных вызовов в службу и обратно).

person Jarek Kardas    schedule 21.12.2012
comment
Спасибо за ссылку, читаю сейчас. В IIS один сайт имеет ~ 15 виртуальных серверов, а некоторые имеют идентичные ставки с тех пор, как запускают одни и те же службы, но на разных портах. 1) относительно ответов клиентов - я использую режим экземпляра службы PerSession, поэтому одна служба для каждого клиентского соединения - person sll; 21.12.2012
comment
И мы установили multipleSiteBindingsEnabled в значение true в web.config - person sll; 21.12.2012
comment
Что касается обратных вызовов в фоновых потоках, уверены ли вы, что это имеет смысл для службы WCF без пользовательского интерфейса? Также я обнаружил, что в случае клиента Silverligth невозможно выполнить асинхронный обратный вызов ?! В любом случае я вручную отправляю поток пользовательского интерфейса, и нет никаких исключений, так как я разрешаю их всем показывать - person sll; 24.12.2012
comment
Если вы обрабатываете обратные вызовы в одном и том же потоке, серверу придется ждать, пока каждый обратный вызов не пройдет, потенциально блокируя его на некоторое время (особенно если вы можете получить тайм-ауты от некоторых клиентов). Если вы выполняете каждый обратный вызов в новом потоке, вы, по сути, можете запустить и забыть и вернуться к обработке входящих сообщений. - person Jarek Kardas; 24.12.2012
comment
Кроме того, может быть сценарий, когда вы вызываете сервер, сервер обращается к тому же потоку, в котором он получил сообщение, поток ожидает ответа клиента, и в то же время клиент вызывает другой метод, который не может быть обработан, потому что поток сервера занят ожидание обратного вызова - здесь может возникнуть тупик, пока не истечет время ожидания одного из подключений. Опять же, это зависит от того, как у вас настроен сервис. - person Jarek Kardas; 24.12.2012
comment
Что касается «огонь-забыть» - выполняя это последовательно, я не нарушаю исходный порядок сообщений, конечно, я могу обойти это, введя порядковый номер, но это будет сделано позже, я думаю, это только вопрос производительности. В любом случае я попробую использовать отдельный поток, чтобы увидеть результаты. Я расскажу вам о результатах - person sll; 24.12.2012
comment
Кстати, эта проблема появляется, даже если сервер не вызывает обратный вызов клиента в любое время - person sll; 24.12.2012

При исследовании проблемы, описанной в этом сообщении StackOverflow, статический конструктор вызывается дважды для службы PerSession WCF Я обнаружил, что Polling Duplex начал стабильно работать, когда я переключил IIS конфигурацию базового AppPool на использование одного рабочего процесса, а не 2, как было указано ранее. Я не уверен, почему 2 был установлен раньше, поскольку я не владею этим сервером, но в любом случае это то, что у меня есть сейчас - несколько клиентов Silverlight, запущенных на одном компьютере, работают стабильно и опрашивают опросы, и нет ошибок 404, все клиенты повторно подключаются к 1 попытка после перезапуска и перезапуска IIS ...

Подробнее см. Параметры пула приложений производительности. Детали

TL; DR: когда WCF, размещенный в IIS, находится в AppPool, который имеет более одного рабочего процесса, дуплексный режим опроса становится нестабильным. Таким образом, в случае высокой нагрузки IIS запустил второй процесс и начал создавать экземпляры службы WCF во втором процессе, поэтому я столкнулся с ситуацией, когда сеанс клиента был создан в одном процессе, но, похоже, опрос иногда достигал другого процесса, который не знает о текущем соединение / сеанс, поэтому начните отказываться от таких сообщений и всей ошибки соединения.

Таким образом, дуплексный режим опроса по своей природе не масштабируется для нескольких процессов в рамках одного сервера IIS и AppPool, другими словами, если у вас более 1 рабочего процесса - это среда WebGarden и дуплекс не масштабируется для веб-ферм и садов

person Community    schedule 25.12.2012