Клиент WCF получает исключение TimeoutException (и я закрываю свои подключения)
-
23-08-2019 - |
Вопрос
Вот в чем дело...Я работаю над этим вопросом уже долгое время, но безуспешно
У меня есть служба WCF, размещенная в IIS (я также пробовал на хосте консоли, и я получаю то же поведение), которую я вызываю через мой созданный scvutil прокси, и служба не отвечает после нескольких (очень немногих вызовов).
Но вот несколько подсказок:
1- Это происходит только в среде тестирования (не с сервисами, размещенными на моем компьютере разработчика), цифры!
2- Я вызываю службу асинхронно (client.MyServiceAsync).
3- это самый сложный вариант...если я запускаю fiddler, чтобы посмотреть, что происходит, клиент работает и никогда не выходит из строя, unitl конечно, я закрываю fiddler (даже не перезапуская клиент)
Пока я понятия не имею, что происходит.Я начал думать, может быть, на сервере (Win2003) есть какой-то "защитник", который блокирует дальнейшие подключения, возможно ли это?Пожалуйста, поверьте мне, когда я говорю, что я закрываю клиентов после каждого вызова, на самом деле после того, как я получаю ответ от сервера, поскольку я использую асинхронные вызовы.
Любой совет был бы более чем оценен.с уважением,
Редактировать:Я подумал, что это может быть полезной информацией:Я включил трассировку на обоих концах, но безуспешно.
На стороне сервера я вижу, как приходят и уходят соединения...и в какой-то момент соединение больше не поступает.Находясь на стороне клиента, я вижу, что соединение работает до тех пор, пока один из них не выдаст исключение TimeoutException...это все, что я получаю
Решение 2
Итак, вот как я исправил проблему на случай, если кто-то столкнется с такой же проблемой.
Мои службы, вызываемые асинхронно, возвращали поток, и этот поток не удалялся на клиенте, таким образом, прокси-серверы не освобождались.
Спасибо всем за комментарии.Они как бы привели меня к решению, поскольку не было ничего НОВОГО, чего я не слышал раньше.
Другие советы
Лучше всего было бы включить трассировку как на клиенте, так и на сервисе, чтобы как бы видеть поток управления.По крайней мере, тогда вы получите некоторое представление о действиях, предпринимаемых WCF.
Вот информация о включении трассировки:http://msdn.microsoft.com/en-us/library/ms733025.aspx
И я бы рекомендовал загрузить трассировки на стороне клиента и сервера в средство просмотра трассировки служб, чтобы вы могли видеть, как события соотносятся друг с другом.Вот еще немного информации об этом инструменте и о том, как прочитать выходные данные:http://msdn.microsoft.com/en-us/library/aa751795.aspx
Этот инструмент бесценен для отладки подобных вещей.Надеюсь, вы сразу поймете, что происходит.
Если вы обнаружите, что по-прежнему не можете просмотреть нужную вам информацию, вы также можете попробовать ведение журнала сообщений (средство просмотра трассировки служб также может считывать эти файлы).
Я действительно думаю, что вы на правильном пути, думая, что это соединения не закрываются должным образом.Особенно при асинхронных операциях, это легко сделать, не осознавая этого.Это случалось со мной в прошлом, когда я воссоздавал свой клиентский объект перед запуском конечного запроса.Это заставило меня быстро закрыть второй подключение объекта, но не первое.Программа просмотра трассировки довольно быстро указала мне на это.
WCF поддерживает регулирование сервиса.Это позволяет вам ограничить количество сообщений / подключений / экземпляров, которые могут выполняться одновременно.Найдите ServiceThrottle в MSDN.
Вы указываете свой ServiceThrottle в конфигурации приложения следующим образом:
<behaviors>
<serviceBehaviors>
<behavior name="Throttled">
<serviceThrottling
maxConcurrentCalls="1"
maxConcurrentSessions="2200"
maxConcurrentInstances="1"
/>
</behavior>
</serviceBehaviors>
</behaviors>
Если вы подозреваете, что проблема заключается в регулировании, поищите объект ServiceThrottle в отладчике или в дампе.Вот пример использования cdb на дампе:
Дамп ServiceHost
0:000> !do 0000000001647fc0
Name: System.ServiceModel.ServiceHost
MethodTable: 000007feef98a7f0
EEClass: 000007feef352d60
Size: 248(0xf8) bytes
(D:\Windows\assembly\GAC_MSIL\System.ServiceModel\3.0.0.0__b77a5c561934e089\System.ServiceModel.dll)
Fields:
MT Field Offset Type VT Attr Value Name
000007fef23d5918 400098a 4c System.Boolean 1 instance 0 aborted
000007fef23d5918 400098b 4d System.Boolean 1 instance 0 closeCalled
000007feef93aa00 400098c 8 ...ct+ExceptionQueue 0 instance 0000000000000000 exceptionQueue
000007fef23d6038 400098d 10 System.Object 0 instance 0000000001648188 mutex
000007fef23d5918 400098e 4e System.Boolean 1 instance 0 onClosingCalled
000007fef23d5918 400098f 4f System.Boolean 1 instance 0 onClosedCalled
000007fef23d5918 4000990 50 System.Boolean 1 instance 1 onOpeningCalled
000007fef23d5918 4000991 51 System.Boolean 1 instance 1 onOpenedCalled
000007fef23d5918 4000992 52 System.Boolean 1 instance 0 raisedClosed
000007fef23d5918 4000993 53 System.Boolean 1 instance 0 raisedClosing
000007fef23d5918 4000994 54 System.Boolean 1 instance 0 raisedFaulted
000007fef23d5918 4000995 55 System.Boolean 1 instance 1 traceOpenAndClose
000007fef23d6038 4000996 18 System.Object 0 instance 0000000001647fc0 eventSender
000007feef929a60 4000997 48 System.Int32 1 instance 2 state
000007fef23ce158 4000998 20 System.EventHandler 0 instance 0000000000000000 Closed
000007fef23ce158 4000999 28 System.EventHandler 0 instance 0000000000000000 Closing
000007fef23ce158 400099a 30 System.EventHandler 0 instance 0000000001648660 Faulted
000007fef23ce158 400099b 38 System.EventHandler 0 instance 0000000000000000 Opened
000007fef23ce158 400099c 40 System.EventHandler 0 instance 0000000000000000 Opening
000007fef23d5918 4002e78 56 System.Boolean 1 instance 1 initializeDescriptionHasFinished
000007feef981300 4002e79 58 ...meKeyedCollection 0 instance 00000000016481a0 baseAddresses
000007feef981500 4002e7a 60 ...patcherCollection 0 instance 0000000001648220 channelDispatchers
000007fef2416b80 4002e7b c0 System.TimeSpan 1 instance 0000000001648080 closeTimeout
000007feef980e70 4002e7c 68 ...erviceDescription 0 instance 0000000001656e28 description
0000000000000000 4002e7d 70 0 instance 0000000001648290 extensions
0000000000000000 4002e7e 78 0 instance 0000000000000000 externalBaseAddresses
0000000000000000 4002e7f 80 0 instance 000000000166cf80 implementedContracts
000007feef989770 4002e80 88 ...nceContextManager 0 instance 0000000001648300 instances
000007fef2416b80 4002e81 c8 System.TimeSpan 1 instance 0000000001648088 openTimeout
000007feef8e9890 4002e82 90 ...rformanceCounters 0 instance 0000000000000000 servicePerformanceCounters
000007feef98b708 4002e83 98 ...rformanceCounters 0 instance 000000000171c590 defaultPerformanceCounters
000007feef981a18 4002e84 a0 ...r.ServiceThrottle 0 instance 0000000001648340 serviceThrottle
000007feef980c20 4002e85 a8 ...erviceCredentials 0 instance 0000000001800ed0 readOnlyCredentials
000007feef980d58 4002e86 b0 ...orizationBehavior 0 instance 0000000001801240 readOnlyAuthorization
0000000000000000 4002e87 b8 0 instance 0000000000000000 UnknownMessageReceived
000007fef53bc640 4002e77 f80 System.Uri 0 static 0000000001648110 EmptyUri
000007fef23d6038 40032cc d0 System.Object 0 instance 00000000015be070 singletonInstance
000007fef23d8420 40032cd d8 System.Type 0 instance 00000000016486a0 serviceType
000007feef981ee0 40032ce e0 ...ontractCollection 0 instance 0000000001657468 reflectedContracts
000007fef23d1000 40032cf e8 System.IDisposable 0 instance 0000000000000000 disposableInstance
Сбросьте информацию о регулировании для ServiceHost
0:000> !do 0000000001648340
Name: System.ServiceModel.Dispatcher.ServiceThrottle
MethodTable: 000007feef981a18
EEClass: 000007feef34c2d8
Size: 72(0x48) bytes
(D:\Windows\assembly\GAC_MSIL\System.ServiceModel\3.0.0.0__b77a5c561934e089\System.ServiceModel.dll)
Fields:
MT Field Offset Type VT Attr Value Name
000007feef981a90 400371d 8 ...cher.FlowThrottle 0 instance 00000000016484a8 calls
000007feef981a90 400371e 10 ...cher.FlowThrottle 0 instance 00000000016485d8 sessions
000007feef902140 400371f 18 ...her.QuotaThrottle 0 instance 0000000000000000 dynamic
000007feef981a90 4003720 20 ...cher.FlowThrottle 0 instance 0000000001779f80 instanceContexts
000007feef9808c8 4003721 28 ...l.ServiceHostBase 0 instance 0000000001647fc0 host
000007fef23d5918 4003722 38 System.Boolean 1 instance 1 isActive
000007fef23d6038 4003723 30 System.Object 0 instance 0000000001648410 thisLock
Сбросьте информацию об ограничении сеанса
0:000> !do 00000000016485d8
Name: System.ServiceModel.Dispatcher.FlowThrottle
MethodTable: 000007feef981a90
EEClass: 000007feef34c390
Size: 64(0x40) bytes
(D:\Windows\assembly\GAC_MSIL\System.ServiceModel\3.0.0.0__b77a5c561934e089\System.ServiceModel.dll)
Fields:
MT Field Offset Type VT Attr Value Name
000007fef23dd9b8 40034f5 30 System.Int32 1 instance 2220 capacity
000007fef23dd9b8 40034f6 34 System.Int32 1 instance **2220 count
000007fef23d6038 40034f7 8 System.Object 0 instance 0000000001648618 mutex
000007fef23c4d70 40034f8 10 ...ding.WaitCallback 0 instance 0000000001648598 release
0000000000000000 40034f9 18 0 instance 0000000001648630 waiters
000007fef23d6748 40034fa 20 System.String 0 instance 00000000016483c8 propertyName
000007fef23d6748 40034fb 28 System.String 0 instance 0000000001648550 configName
0:000>