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)