2012-03-21 3 views
2

Мы используем службы WCF, размещенные в IIS на среднем уровне, и используем WPF-клиент. Мы видим эти ошибки в наших журналах производства. Из google я указал на ссылку http://kennyw.com/indigo/150, в которой четко сказано, что эта ошибка связана с MaxConcurrentSessions.Прокси-соединение WCF открыто вызывает ошибки

В приведенной ниже документации о производстве говорится, что ошибка возникает, когда клиент WPF пытается открыть соединение с прокси-сервером WCF с помощью ICommunicationObject.Open() Эта ошибка в нашей производственной системе происходит очень часто, но я не могу воспроизвести эту ошибку на моя локальная настройка. Я попытался изменить MaxConcurrentSessions на 1, а затем открыл 5 экземпляров приложения WPF. В приложении WPF на панели управления по умолчанию работает таймер, работающий каждые 1 минуту, пытаясь получить данные, но все же я не могу воспроизвести эту ошибку.

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

Любые идеи, если я нахожусь на правильном пути, это MaxConcurrentSessions, подходящее место для просмотра и как имитировать это на локальном. Пожалуйста помоги.

2/16/2012 4:10:40 PM:Information:Exception in the ServiceCall constructor:  System.ServiceModel.CommunicationException: 
    The socket connection was aborted. 
    This could be caused by an error processing your message or a receive timeout being exceeded by the remote host, or an underlying network resource issue. 
    Local socket timeout was '00:00:59.9687730'. --->System.Net.Sockets.SocketException: 
An existing connection was forcibly closed by the remote host at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags) at System.ServiceModel.Channels.SocketConnection.ReadCore(Byte[] buffer, Int32 offset, Int32 size, TimeSpan timeout, Boolean closing) 
--- End of inner exception stack trace --- 
Server stack trace: 
at System.ServiceModel.Channels.SocketConnection.ReadCore(Byte[] buffer, Int32 offset, Int32 size, TimeSpan timeout, Boolean closing) 
at System.ServiceModel.Channels.SocketConnection.Read(Byte[] buffer, Int32 offset, Int32 size, TimeSpan timeout) 
at System.ServiceModel.Channels.DelegatingConnection.Read(Byte[] buffer, Int32 offset, Int32 size, TimeSpan timeout) 
at System.ServiceModel.Channels.ConnectionUpgradeHelper.InitiateUpgrade  (StreamUpgradeInitiator upgradeInitiator, IConnection& connection, ClientFramingDecoder decoder, IDefaultCommunicationTimeouts defaultTimeouts, TimeoutHelper& timeoutHelper) 
at System.ServiceModel.Channels.ClientFramingDuplexSessionChannel.SendPreamble(IConnection connection, ArraySegment`1 preamble, TimeoutHelper& timeoutHelper) 
at System.ServiceModel.Channels.ClientFramingDuplexSessionChannel.DuplexConnectionPoolHelper.AcceptPooledConnection(IConnection connection, TimeoutHelper& timeoutHelper) 
at System.ServiceModel.Channels.ConnectionPoolHelper.EstablishConnection(TimeSpan timeout) 
at System.ServiceModel.Channels.ClientFramingDuplexSessionChannel.OnOpen(TimeSpan timeout) 
at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) 
at System.ServiceModel.Channels.ServiceChannel.OnOpen(TimeSpan timeout) 
at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) 

ответ

2

Существует хороший шанс, что основная причина вашей проблемы является неправильным одноразовой экземпляры прокси-службы в вашем WPF приложении. Посмотрите, как создаются прокси и находится.

Если ваш код не соответствует одному из шаблонов, описанных в ответах на этот вопрос SO question, то вы не освобождаете TCP-соединения должным образом. Эта проблема чаще всего возникает при использовании привязок, зависящих от сеансов TCP.

+0

Мы используем используя блок для каждого соединения, перекрываться в IDispose, чтобы удалить объект, который является чистым способом сделать это. -------------------------------- public void TryCloseOrAbort (ICommunicationObject obj) {if (obj! = null) {if (obj.State! = CommunicationState.Faulted && obj.State! = CommunicationState.Closed) {try {obj.Close(); } catch (CommunicationObjectFaultedException) {obj.Abort(); } catch (TimeoutException) {obj.Abort(); } catch (Exception) {obj.Abort(); throw;}} else obj.Abort();}} – lloydom

+0

Единственное, что я вижу в этом немного странном коде, это вызов Abort() на экземпляр obj который имеет obj.State == CommunicationState.Closed. Попробуйте проверить документацию [ICommunicationObject] (http://msdn.microsoft.com/en-us/library/ms789041.aspx), чтобы узнать, может ли это вызвать проблему в процессе удаления. –

+0

Спасибо за ваш ответ sixto. Ссылка говорит, что вызов прерывания по значению состояния связи закрыт не вызывает проблемы. «Метод Abort() ничего не делает, если текущее состояние закрыто или если объект был прерван раньше», поэтому он не должен вызвать эту проблему, я вижу. Как вы думаете, ошибка только из-за использования блока? -------------------------------------------------- -Using (var svc = new ServiceCall (endpointName)) {serviceCallType = svc.GetType(); // Вызвать вызов вызывающего вызова службы callCallBody (svc); } – lloydom

0

Может возникнуть пара причин этой ошибки. MaxConcurrentSessions является одним из них.

В файле конфигурации для сервера и клиента обязательно увеличить ReceiveTimeout и SendTimeout. Вы можете превышать время, разрешенное этими параметрами.

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

Кроме того, ссылка MS для их конфигураций XML приведена ниже и может помочь вам найти причину проблемы.

http://msdn.microsoft.com/en-us/library/ms731354.aspx

0

Put этой линия в App.Config в потребительской стороне

<system.net> 
    <defaultProxy useDefaultCredentials="true"> 
    <proxy usesystemdefault="True" bypassonlocal="True"/> 
    </defaultProxy> 
</system.net>