2012-06-25 2 views
4

Я знаю, что есть довольно много вопросов по этой проблеме, но ответ не решил мою проблему.Соединение с розеткой отменено с использованием NetTcpBinding

У меня есть NetTcpBinding на работающем сервере, и время от времени (не всегда, как 1 из 20 до 60 вызовов, полностью случайной) я получаю это исключение на стороне клиента:

соединение сокета было прервано. Это может быть вызвано ошибкой , обрабатывающей ваше сообщение или превышением тайм-аута приема на удаленном хосте , или проблема с сетевым ресурсом. Локальный сокет таймаут был '00: 01: 00 '.

Я заметил, что это исключение происходит гораздо чаще, когда соединение клиента происходит медленно.

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

Что я делаю:

var client = GetClient(); 
client.Open(); 
bool success = client.Call(); // Exception occurs here (the return value is a bool) 

я иногда получаю это исключение на стороне сервера:

Ошибка TCP (995: Операция ввода/вывода была прервана из-либо выход потока или запрос приложения) при передаче данных .

У меня включен трассировка сервера, но я получаю те же исключения, и это не дает мне дополнительной информации.

Мои GetClient:

NetTcpBinding netTcpBinding = new NetTcpBinding 
{ 
    CloseTimeout = new TimeSpan(0, 0, 30), 
    OpenTimeout = new TimeSpan(0, 0, 30), 
    TransferMode = TransferMode.Buffered, 
    ListenBacklog = 2, 
    MaxConnections = 2, 
    MaxReceivedMessageSize = 10485600, 
    ReaderQuotas = { MaxStringContentLength = 1048576 }, 
    ReliableSession = { Enabled = false }, 
    Security = 
    { 
     Mode = SecurityMode.Transport, 
     Transport = { ClientCredentialType = TcpClientCredentialType.None, ProtectionLevel = ProtectionLevel.EncryptAndSign }, 
     Message = { ClientCredentialType = MessageCredentialType.Windows } 
    } 
}; 

Важно конфигурации от службы:

<behaviors> 
    <serviceBehaviors> 
     <behavior name="ServiceBehavior"> 
      <serviceMetadata httpGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="true" httpHelpPageEnabled="true" httpsHelpPageEnabled="true" /> 
      <serviceAuthorization principalPermissionMode="Custom" serviceAuthorizationManagerType="My.Service.WCF.Tools.CustomAuthorizationManager, My.Service.WCF"> 
       <authorizationPolicies> 
        <clear/> 
        <add policyType="My.Service.WCF.Tools.CustomAuthorizationPolicy, My.Service.WCF" /> 
       </authorizationPolicies> 
      </serviceAuthorization> 
      <serviceCredentials> 
       <serviceCertificate findValue="MyService" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" /> 
      </serviceCredentials> 
      <serviceThrottling maxConcurrentCalls="65536" maxConcurrentSessions="65536" maxConcurrentInstances="65536" /> 
     </behavior> 
    </serviceBehaviors> 
</behaviors> 
<bindings> 
    <customBinding> 
     <binding name="ServiceBinding" receiveTimeout="00:05:00" maxConnections="65536" listenBacklog="65536"> 
      <transactionFlow />      
      <sslStreamSecurity requireClientCertificate="false" /> 
      <binaryMessageEncoding /> 
      <tcpTransport transferMode="Buffered" portSharingEnabled="true" maxReceivedMessageSize="1048576" maxPendingConnections="65536" maxPendingAccepts="10"> 
       <connectionPoolSettings leaseTimeout="00:05:00" idleTimeout="00:05:00" maxOutboundConnectionsPerEndpoint="65536" /> 
      </tcpTransport> 
     </binding> 
     <binding name="MexBinding" receiveTimeout="00:05:00" maxConnections="65536" listenBacklog="65536"> 
      <tcpTransport transferMode="Buffered" portSharingEnabled="true" maxReceivedMessageSize="1048576" maxPendingConnections="65536" maxPendingAccepts="10"> 
       <connectionPoolSettings leaseTimeout="00:05:00" idleTimeout="00:05:00" maxOutboundConnectionsPerEndpoint="65536" /> 
      </tcpTransport> 
     </binding> 
    </customBinding> 
</bindings> 

Я уже обновил ссылку на службу и попытались изменить некоторые из буфера и размеров, но он не работает (не то, что я ожидал бы там проблемы, поскольку возвращается только bool).

Фиксированный с помощью:

OperationContext.Current.OperationCompleted += Test; 

private void Test(object sender, EventArgs e) 
{ 
    OperationContext.Current.Channel.Close(); 
} 

Не используйте Прервать но Закрыть метод!

+0

Вы увеличили свой sendTimeout, а также на netTcpBinding на клиенте? – Rajesh

+0

Да, я тоже пробовал это, но так как 1 минута уже очень длинная (для одного вызова обычно требуется всего 10 мс), увеличение ее не помогает. Кроме того, исключение происходит почти мгновенно, а не через 1 минуту. –

+0

Также ваш тайм-аут открыт и закрыт на 30 секунд в вашей привязке к клиенту? – Rajesh

ответ

1

Я нашел проблему: я прервала канал на стороне сервера с

OperationContext.Current.OperationCompleted 

, который называется:

OperationContext.Current.Channel.Abort(); 

Это, кажется, работает хорошо в 99% случаев, но не все, используя:

OperationContext.Current.Channel.Close(); 

полностью разрешил мою проблему.