Исключение во время нескольких асинхронных вызовов WCF (сообщение не может быть обработано ...) - PullRequest
2 голосов
/ 23 января 2010

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

У меня есть тестовое приложение-победитель, которое проходит цикл для до пика x числа асинхронных вызовов. Каждый асинхронный вызов создает свой собственный экземпляр прокси WCF и вызывает службу WCF, используя этот прокси. Если x около 35 или меньше, все хорошо. Если x > 40 или около того, многие вызовы завершаются просто отлично, но горстка возвращает это:

System.ServiceModel.Security.MessageSecurityException: 
  An unsecured or incorrectly secured fault was received from the other party. 
  See the inner FaultException for the fault code and detail. ---> 
  System.ServiceModel.FaultException: The message could not be processed. 
  This is most likely because the action 'http://tempuri.org/IMyService/MakeRequest' 
  is incorrect or because the message contains an invalid or expired 
  security context token or because there is a mismatch between bindings. 
  The security context token would be invalid if the service aborted 
  the channel due to inactivity. To prevent the service from aborting 
  idle sessions prematurely increase the Receive timeout on the 
  service endpoint's binding.
  --- End of inner exception stack trace ---

Server stack trace: 
   at System.ServiceModel.Security.SecuritySessionClientSettings`1.SecurityRequestSessionChannel.ProcessReply(Message reply, TimeSpan timeout, SecurityProtocolCorrelationState correlationState)
   at System.ServiceModel.Security.SecuritySessionClientSettings`1.SecurityRequestSessionChannel.Request(Message message, TimeSpan timeout)
   at System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
   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)
   at ...

Я использую клиентские и серверные сертификаты с защитой сообщений. Я не понимаю, почему он работает нормально только определенное количество раз, затем рвет. Также кажется, что выдает ошибку при вызовах, которые сделаны ближе к концу итерации. Кроме того, эта ошибка возникает задолго до того, как истечет любой из моих таймаутов, которые установлены на стороне клиента и на стороне сервера:

<binding name="WSHttpBinding_IMyService" 
         closeTimeout="00:10:00" openTimeout="00:10:00" 
         receiveTimeout="00:10:00" sendTimeout="00:10:00"... />

Кроме того, я использую регулирование службы:

<serviceThrottling 
       maxConcurrentCalls="100" 
       maxConcurrentSessions="100" />

Есть идеи?

Спасибо, Марк.

1 Ответ

0 голосов
/ 23 января 2010

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

Ошибка, вероятно, связана с созданием или закрытием и очисткой прокси.

Вы не опубликовали свой код, но можете решить проблему и повысить производительность своего кода, следуя следующим рекомендациям: http://blogs.msdn.com/wenlong/archive/2007/10/27/performance-improvement-of-wcf-client-proxy-creation-and-best-practices.aspx

Другая типичная проблема с асинхронными вызовами wcf заключается в том, чтобы убедиться, что прокси-сервер не закрыт, прежде чем асинхронный вызов вернется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...