2012-05-30 3 views
2

app.config моего сервисаСуществующее соединение было принудительно закрыто удаленным узлом

<system.serviceModel> 
<client> 
    <endpoint name="DataLocal" address="net.tcp://SomeAddress" binding="netTcpBinding" contract="ISomeContract" bindingConfiguration="TcpCustomSecurity" behaviorConfiguration="SecureBehaviorName"> 
    <identity> 
     <dns value="localhost"/> 
    </identity> 
    </endpoint> 
</client> 
    <services>  
    <service name="SomeService"> 
    <host> 
     <baseAddresses> 
     <add baseAddress="http://SomeService" /> 
     <add baseAddress="net.tcp://SomeService" /> 
     </baseAddresses> 
    </host> 
    <endpoint name="SomeService_Normal" address="Secure" binding="netTcpBinding" contract="ISomeService" bindingConfiguration="TcpNormal"/> 
    </service> 
</services> 
<bindings> 
    <netTcpBinding>   
    <binding name="TcpNormal" transferMode="Buffered" receiveTimeout="24.20:31:23.6470000"> 
     <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/> 
     <security mode="None" /> 
    </binding> 
    <binding name="TcpCustomSecurity" transferMode="Buffered" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="24.20:31:23.6470000" sendTimeout="00:01:00" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" maxBufferPoolSize="2147483647"> 
     <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/> 
     <security mode="Message"> 
     <message clientCredentialType="UserName"/> 
     </security> 
    </binding> 
    </netTcpBinding> 
</bindings> 
<behaviors> 
    <endpointBehaviors> 
    <behavior name="SecureBehaviorName"> 
     <clientCredentials> 
     <serviceCertificate> 
      <authentication certificateValidationMode="None"/> 
     </serviceCertificate> 
     </clientCredentials> 
     <dataContractSerializer maxItemsInObjectGraph="2147483647"/> 
    </behavior> 
    </endpointBehaviors> 
</behaviors> 

Ниже приведены высказывания стека для ошибки я получаю ..

>   System.dll!System.Net.Sockets.Socket.Send(byte[] buffer, int offset, int size, System.Net.Sockets.SocketFlags socketFlags) + 0x5a bytes 
     System.ServiceModel.dll!System.ServiceModel.Channels.SocketConnection.Write(byte[] buffer, int offset, int size, bool immediate, System.TimeSpan timeout) + 0xa7 bytes 
     System.ServiceModel.dll!System.ServiceModel.Channels.SocketConnection.Write(byte[] buffer, int offset, int size, bool immediate, System.TimeSpan timeout, System.ServiceModel.Channels.BufferManager bufferManager) + 0x34 bytes 
     System.ServiceModel.dll!System.ServiceModel.Channels.BufferedConnection.WriteNow(byte[] buffer, int offset, int size, System.TimeSpan timeout, System.ServiceModel.Channels.BufferManager bufferManager) + 0x90 bytes  
     System.ServiceModel.dll!System.ServiceModel.Channels.BufferedConnection.Write(byte[] buffer, int offset, int size, bool immediate, System.TimeSpan timeout, System.ServiceModel.Channels.BufferManager bufferManager) + 0x47 bytes 
     System.ServiceModel.dll!System.ServiceModel.Channels.FramingDuplexSessionChannel.OnSend(System.ServiceModel.Channels.Message message, System.TimeSpan timeout) + 0x115 bytes 
     System.ServiceModel.dll!System.ServiceModel.Channels.OutputChannel.Send(System.ServiceModel.Channels.Message message, System.TimeSpan timeout) + 0x81 bytes  
     System.ServiceModel.dll!System.ServiceModel.Dispatcher.DuplexChannelBinder.Request(System.ServiceModel.Channels.Message message, System.TimeSpan timeout) + 0x154 bytes 
     System.ServiceModel.dll!System.ServiceModel.Channels.ServiceChannel.Call(string action, bool oneway, System.ServiceModel.Dispatcher.ProxyOperationRuntime operation, object[] ins, object[] outs, System.TimeSpan timeout) + 0x206 bytes   
     System.ServiceModel.dll!System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(System.Runtime.Remoting.Messaging.IMethodCallMessage methodCall, System.ServiceModel.Dispatcher.ProxyOperationRuntime operation) + 0x59 bytes 
     System.ServiceModel.dll!System.ServiceModel.Channels.ServiceChannelProxy.Invoke(System.Runtime.Remoting.Messaging.IMessage message) + 0x65 bytes    
     mscorlib.dll!System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(ref System.Runtime.Remoting.Proxies.MessageData msgData, int type) + 0xee bytes 

// Первый вызов службы в вышеуказанном стеке ...

служба Поведение заключается в следующем: [ServiceBehavior (InstanceContextMode = InstanceContextMode.Single)]

Ошибка произошла после нескольких часов постоянного тестирования ... не смог воспроизвести его во время отладки ..

EDIT:

Я получил результаты трассировки благодаря Dejan ...

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

на второе я получаю вхождение этого сообщения: Системы ударила предел, установленный для дросселя «MaxConcurrentConnections'.Limit для этого дроссель был установлен на значение 200.Throttle можно изменить с помощью атрибута„maxConcurrentSessions“в сервисном дросселеме элемент.

Так что для второго сообщения я сделал это:

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

Пожалуйста, обратитесь к обновлению моего app.config, чтобы избежать такого сценария.

UPDATE

Я получил результаты по отслеживанию ...

на первом я получаю вхождение это сообщение: Максимальное количество ожидающих соединений было достигнуто.

на второе я получаю вхождение этого сообщения: Система ударила предел, установленный для газа «MaxConcurrentConnections'.Limit для этого дросселя был установлен на значение 200.Throttle можно изменить с помощью атрибута„maxConcurrentSessions“в элементе дроссельной службы ,

Так что для второго сообщения я сделал это:

<serviceBehaviors> 
    <behavior name="tcpNormalBehavior"> 
     <serviceThrottling maxConcurrentSessions="800" maxConcurrentInstances="800" maxConcurrentCalls="200" /> 
     <dataContractSerializer maxItemsInObjectGraph="2147483647" /> 
    </behavior> 
    </serviceBehaviors> 

и назначил такое поведение службы к службе. Мне нужно установить maxConnections для привязки для первого сообщения. Кроме того, это основная причина проблемы, первая или вторая одна или обе. Потому что в последующих сообщениях я всегда получаю второе сообщение.

Просим руководствоваться.

+1

Попробуйте выполнить обработку или регистрацию исключений в службе – VJAI

+1

Я обновил свой ответ ниже. –

+0

Спасибо, Деян. мы не можем закрыть прокси-сервер, поскольку мы используем MEF и используем тот же самый прокси-сервер в приложении. Повысить maxConcurrentSessions не является хорошим решением? –

ответ

1

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

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

EDIT
Что касается обновленного вопроса: Вы получаете это исключение, потому что вы не закрывая соединение со стороны клиента после того, как вы закончите с вызовом. Попробуйте рефакторинг кода, поэтому вызовы в WCF выглядят следующим образом:

WCFProxy clientProxy = null; 
try 
{ 
    clientProxy = new WCFProxy(); 
    clientProxy.SomeCall(); 
    clientProxy.Close(); 
} 
catch (Exception) 
{ 
    if (clientProxy != null) 
    { 
     clientProxy.Abort(); 
    } 
    throw; 
} 

, а затем посмотреть, не вызовет ли это проблем.

+0

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

+0

@ RaoBHavik, тем не менее, вы должны включить отслеживание, чтобы понять, почему он перестанет работать. –

+0

Я. Я выполняю трассировку. Как это связано с количеством звонков в службу? –

Смежные вопросы