WCF - Случайное время ожидания клиента при совершении нескольких вызовов

у меня естьWPF клиент запрашивает данные черезWCF сервис размещен вIIS 7, Сервисный метод выполняет вызов хранимой процедуры (SQL 2012) с помощьюEF чтобы получить некоторые данные.

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

Мы используем сгенерированные сервисные прокси, которые простираются отSystem.ServiceModel.ClientBase.

Мы'также использовать пользовательскую привязку http с двоичным кодированием (изВот) - фактическая реализация показана здесь:


   
      
      
      
      
   

Также в IIS включено динамическое сжатие. Я могу просмотреть запросы в Fiddler и размер сообщения:тело в порядке (~ 50 КБ) и99% запросов возвращаются через секунду или две, Отлично!

Однако, почти с каждой итерацией, есть один вызов в связке, который занимает минуты, и я нене знаю почему ... МойsendTimeOut на клиенте было на 1 минуте и естественно, что один звонок потерпит неудачу. Я продлил его до 10 минут, и звонок, кажется, завершается чуть более чем за 2 минуты - хотя иногда это занимало бы еще больше времени. Проблема кажется очень случайной - это может быть первый звонок, это может быть 30-й звонок. Но это'очень воспроизводимо.

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

Используя Fiddler, проблемный вызов генерирует вывод, подобный следующему:

ACTUAL PERFORMANCE
--------------
ClientConnected:     14:02:42.959
ClientBeginRequest:  14:03:01.224
GotRequestHeaders:   14:03:01.224
ClientDoneRequest:   14:03:01.574
Determine Gateway:   0ms
DNS Lookup:      0ms
TCP/IP Connect:  46ms
HTTPS Handshake:     0ms
ServerConnected:     14:05:16.021
FiddlerBeginRequest: 14:05:16.021
ServerGotRequest:    14:05:16.021
ServerBeginResponse: 14:03:04.784
GotResponseHeaders:  14:05:16.561
ServerDoneResponse:  14:05:16.611
ClientBeginResponse: 14:05:16.611
ClientDoneResponse:  14:05:16.611

Обратите внимание на значительное время междуServerBeginResponse а такжеGotResponseHeaders, Это кажется поразительно похожим на проблему, замеченнуюВот.

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

Как мне понять, в чем и где проблема? Это сериализация? Это проблема сети? Может ли сервер не поспевать за клиентом, отправляющим так много запросов?

мы попытались настроить регулирование WCF в файле конфигурации, добавив соответствующийserviceBehaviors, но это не имело значения.

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

Я могу предоставить более подробную информацию, если это необходимо.

Изменить (6.10.2013): Не уверен, что это связано или просто случайность, но пару раз яМы заметили, что при проблемном вызове размер тела значительно меньше, чем у других. Это не так каждый раз, но это может дать некоторые подсказки. Вот снимок экрана от Fiddler, чтобы показать вам, насколько согласованным должен быть размер тела при каждом вызове. Выбранная запись (# 21) значительно меньше других по размеру, но занимает более 2 минут.

Как ни странно, на этот раз я получил исключение. Исключение не бывает каждый раз.

System.ServiceModel.CommunicationException: The server did not provide a meaningful reply; this might be caused by a contract mismatch, a premature session shutdown or an internal server error.

Server stack trace: 
   at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs)
   at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
   at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

Exception rethrown at [0]: 
   at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
   at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)

Ответы на вопрос(2)

Ваш ответ на вопрос