Я знаю, что есть довольно много вопросов по этой проблеме, но ответ не решил мою проблему.Соединение с розеткой отменено с использованием 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();
}
Не используйте Прервать но Закрыть метод!
Вы увеличили свой sendTimeout, а также на netTcpBinding на клиенте? – Rajesh
Да, я тоже пробовал это, но так как 1 минута уже очень длинная (для одного вызова обычно требуется всего 10 мс), увеличение ее не помогает. Кроме того, исключение происходит почти мгновенно, а не через 1 минуту. –
Также ваш тайм-аут открыт и закрыт на 30 секунд в вашей привязке к клиенту? – Rajesh