Исключение CommunicationObjectAbortedException возникает, когда клиент WCF ожидает асинхронного возврата из автономного сервиса

#c# #wcf

#c# #wcf

Вопрос:

У меня есть клиент WCF, который создает автономную службу. Клиент в конечном итоге разместит другие конечные точки службы, поэтому клиент поддерживает список ссылок на службы локально, m_services, и вызывает методы службы на каждой поддерживаемой конечной точке. Создается ServiceHost, а клиент создается в конечной точке. В службу успешно выполняется несколько вызовов настройки.

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

Пока клиент ожидает ответа, я в конечном итоге получаю следующие исключения в свою консоль вывода.

A first chance exception of type 'System.ServiceModel.CommunicationObjectAbortedException' occurred in System.ServiceModel.dll
A first chance exception of type 'System.ServiceModel.CommunicationObjectAbortedException' occurred in System.ServiceModel.dll
A first chance exception of type 'System.ServiceModel.CommunicationObjectAbortedException' occurred in System.Runtime.DurableInstancing.dll
A first chance exception of type 'System.ServiceModel.CommunicationObjectAbortedException' occurred in System.Runtime.DurableInstancing.dll
A first chance exception of type 'System.ServiceModel.CommunicationException' occurred in System.Runtime.DurableInstancing.dll

Ниже приведен код, который я использую для создания ServiceHost для автономного сервиса. Я что-то неправильно делаю с настройкой моего ServiceHost и клиента? Я не уверен, почему изначально клиент реагирует на вызовы и выдает ожидаемые результаты, но в конечном итоге происходит сбой, и объект связи прерывается. Изначально у меня был ServiceHost в качестве локальной переменной для метода, который его создавал, но я перенес его в поле класса, думая, что это, возможно, собранный мусор.

 m_selfHost = new ServiceHost(hostType);
var binding = new WSDualHttpBinding();
ContractDescription contractDescription =
    ContractDescription.GetContract(contractType);
EndpointAddress endpointAddress = new EndpointAddress(Properties.Settings.Default.SelfHostedServiceUrl);
ServiceEndpoint endpoint = new ServiceEndpoint(contractDescription, binding, endpointAddress);
m_selfHost.AddServiceEndpoint(endpoint);

DllAnalyzerServiceClient service = new DllAnalyzerServiceClient(m_instanceContext, binding, endpointAddress);
m_selfHost.Open();
service.Subscribe();
service.DynamicallyLoadDll(crxDllFile);
m_services.Add(service);
  

Комментарии:

1. Может ли быть так, что канал обратного вызова генерирует это сообщение об ошибке исключения?

Ответ №1:

Я полагаю, что причина, по которой я испытывал эти проблемы, заключается в том, что время ожидания службы истекло из-за бездействия, поскольку я заметил, что время ожидания истекло по умолчанию, равному 10 минутам. В app.config сервиса я создаю схему двойной привязки HTTP по умолчанию, которая устанавливает время ожидания бесконечным.

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

 <system.serviceModel>
    <bindings>
      <wsDualHttpBinding>
        <binding name="DefaultDualHttpBinding" receiveTimeout="Infinite">
          <reliableSession inactivityTimeout="Infinite" />
        </binding>
      </wsDualHttpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="DllAnalyzerService.Service1Behavior"
        name="DllAnalyzerService.DllAnalyzerService">
        <endpoint address="" binding="wsDualHttpBinding" bindingConfiguration="DefaultDualHttpBinding"
          contract="DllAnalyzerService.IDllAnalyzerService">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8732/Design_Time_Addresses/DllAnalyzerService/DllAnalyzerService/" />
          </baseAddresses>
        </host>
      </service>
    </services>