WCF: соединение с сокетом было прервано - PullRequest
3 голосов
/ 21 октября 2010
CommunicationException was unhandled by user code
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 '02:48:04.9840000'.

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

InnerException: System.IO.IOException: сбой операции чтения, см. Внутреннее исключение

(Inner) InnerException: System.Net.Sockets.SocketException - существующее соединение было принудительно закрыто удаленнымхост.

Любые предложения с благодарностью!

Заранее спасибо

Ответы [ 6 ]

9 голосов
/ 22 октября 2010

Как правило, я видел эту ошибку, когда противоположная сторона не закрыла соединение.Если на стороне клиента у вас есть класс, унаследованный от ClientBase<T>, тогда вы должны вызвать Close, когда закончите работу со службой (фактически ClientBase<T> реализует IDisposable, чтобы вы могли использовать оператор using).

Если вы используете ChannelFactory<T> для создания соединения со службой, результатом будет прокси, который реализует контракт, но также реализует ICommunicationObject;Вы должны вызвать Close, когда закончите.

На стороне службы все не так, сеанс (и, следовательно, базовый сокет) управляется клиентом.Если служба отбрасывает сокет, скорее всего, это является результатом ошибки, и в этом случае предложение Music Magi является хорошим.Microsoft говорит о том, как это сделать здесь .

Обратите внимание, что для получения четкого представления о том, что происходит, вам может потребоваться настроить трассировку как для клиента, так и для службы.Для просмотра следов вы должны использовать SvcTraceViewer, который должен находиться в папке Program Files\Microsoft SDKs\Windows\v6.0A\bin или Program Files\Microsoft SDKs\Windows\v7.0A\bin.Если вам нужно отследить как клиента, так и службу, вы можете открыть оба файла вместе в SvcTraceViewer с помощью меню File / Add.

4 голосов
/ 22 октября 2010

Скорее всего, у вас возникают проблемы с квотами, такие как MaxReceivedMessageSize, MaxArrayLength, MaxStringContentLength, определенные в привязке.

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

3 голосов
/ 14 августа 2015

Я испытал прерывание соединения через сокет по разным причинам, которые, по моему мнению, заслуживают ответа.

В дополнение к отсутствию достаточно высоких значений в вашем MaxReceivedMessageSize, MaxArrayLength, MaxStringContentLength, MaxItemsInObjectGraph, как указал Иоганн ...

Убедитесь, что типы, которые вы сериализуете, хорошо работают с WCF. Например, у меня возникла та же проблема, но потом я понял, что отправляю System.DBNull по кабелю, что вызвало прерывание службы. Как только я отфильтровал DBNull объекты, все снова заработало.

2 голосов
/ 17 октября 2018

В моем случае к объекту ответа было добавлено перечисление, но хранимая процедура, используемая для заполнения объекта, не возвращала значение из базы данных.Он возвращал значение по умолчанию (равное нулю), которое не является допустимым значением для созданного перечисления.Как пример:

using System;

namespace Playground
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            Console.WriteLine((int)new SomeResponse().Enum);
            Console.ReadLine();
        }

        public enum SomeEnum
        {
            Value1 = 1,
            Value2 = 2,
            Value3 = 3
        }

        public class SomeResponse
        {
            public SomeEnum Enum { get; set; }
        }
    }
}

Вы увидите, что значение перечисления равно нулю, даже если значение перечисления не равно нулю.

Если вы попытаетесь вернуть объект SomeResponse из вызова WCF, и у него будет это состояние, вы получите ту же ошибку, что и в вопросе.

0 голосов
/ 23 мая 2019

В моем случае у нас есть две системы - remoteSystem и clientSystem

  • Обе системы имеют свои публичные / частные сертификаты для аутентификации.
  • Каждая система имеет свойсобственный закрытый ключ и открытый ключ своего партнера.
  • Клиент аутентифицируется с помощью dev.clientSubsystem.acme cert

Сначала подозревался брандмауэр, но это было устранено путем тестирования с

Test-NetConnection -Port 808 -ComputerName dev.remote-system.acme-corp.net-InformationLevel Detailed

Оказалось, что эта ошибка произошла, когда clientSystem настроена для аутентификации с использованием своего закрытого сертификата (dev.clientSubsystem.acme), но сертификат не существует - или в нашем случае ссылка на неправильный сертификатаутентификация.

<system.serviceModel>
   <client>
      <endpoint name="RemoteSystemService" address="net.tcp://dev.remote-system.acme-corp.net:808/service.svc" behaviorConfiguration="remoteSystemNetTcpBindingBehavior" binding="netTcpBinding" contract="AcmeCorp.RemoteSystem.IRemoteSystemService">
         <identity>
            <dns value="dev.remote-system.acme" />
         </identity>
      </endpoint>
   </client>
   <bindings>
      <netTcpBinding>
         <binding>
            <security mode="Transport">
               <transport clientCredentialType="Certificate" protectionLevel="EncryptAndSign" />
            </security>
         </binding>
      </netTcpBinding>
   </bindings>
   <behaviors>
      <endpointBehaviors>
         <behavior name="remoteSystemNetTcpBindingBehavior">
            <clientCredentials>
               <clientCertificate findValue="CN=dev.clientSubsystem.acme" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectDistinguishedName" />
               <serviceCertificate>
                  <authentication certificateValidationMode="PeerTrust" />
               </serviceCertificate>
            </clientCredentials>
         </behavior>
      </endpointBehaviors>
   </behaviors>
</system.serviceModel>
0 голосов
/ 28 ноября 2018

в моем случае я возвращал поток с условием использования потока. Это закрыло поток перед отправкой и создало ошибку прерванного соединения.

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