Служба WCF выдает ошибку Не было прослушивания конечной точки

У меня есть приложение WPF/WCF, в котором я использовал внешнюю веб-службу, ссылаясь на URL-адрес .asmx в папке ссылок на службы моего решения.

На стороне сервера я создал записи в web.config, как показано ниже:

<binding name="ExtractService" 
     closeTimeout="00:01:00" openTimeout="00:01:00" 
     receiveTimeout="00:01:00" sendTimeout="00:10:00" 
     allowCookies="false" bypassProxyOnLocal="false" 
     hostNameComparisonMode="StrongWildcard" 
     maxBufferSize="2147483647" maxBufferPoolSize="524288" 
     maxReceivedMessageSize="2147483647"  
     messageEncoding="Text" textEncoding="utf-8" 
     transferMode="Buffered" useDefaultWebProxy="true">
    <readerQuotas maxDepth="32" maxStringContentLength="8192" 
           maxArrayLength="2147483647" maxBytesPerRead="4096" 
           maxNameTableCharCount="2147483647" />
    <security mode="Transport">
        <transport clientCredentialType="None" proxyCredentialType="None" realm="" />
        <message clientCredentialType="UserName" algorithmSuite="Default" />
    </security>
</binding>
<client>
    <endpoint name="ExtractService" 
        address="https://example.com/DataExtractService.asmx" 
        binding="basicHttpBinding" bindingConfiguration="ExtractService" 
        contract="ExtractService" />
</client>

Также у меня есть запись app.config на стороне клиента, такая же, как web.config выше.

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

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

Сообщение: HandlingInstanceID: 71a85aef-dbb0-4c28-9035-57f8b7526ee0
Возникло и было перехвачено исключение типа «System.ServiceModel.EndpointNotFoundException».

Не было ни одной конечной точки на https://example.com/DataExtractService.asmx, которая могла бы принять сообщение. Это часто вызвано неверным адресом или действием SOAP. Дополнительные сведения см. в разделе InnerException, если он присутствует.

Чтобы решить эту проблему, я попытался скопировать ту же конфигурацию в файл app.exe.config на стороне клиента, но это не сработало.

Где я пропустил конфигурацию клиента? Я также скопировал app.config в папку bin сервера, но это не помогло.


person Anil Soman    schedule 26.06.2016    source источник


Ответы (1)


  • На стороне сервера должен быть раздел <services>, определяющий, какие службы доступны в каких конечных точках на этом сервере (должен быть по крайней мере ОДИН подраздел <service>, определяющий по крайней мере ОДНА конечная точка, на которой доступен этот сервис (также может быть несколько).

  • Затем клиентская сторона должна содержать раздел <client>, который подключается к одной из этих доступных конечных точек.

Или вкратце: если у вас нет раздела <services> в конфигурации на стороне сервера, значит, вы не предоставили какие-либо конечные точки для подключения, таким образом, приводит к этой ошибке.

Таким образом, ваша конфигурация на стороне сервера должна выглядеть примерно так:

<!-- Behavior is optional - maybe you need to define something, maybe not -->
<behaviors>
    <serviceBehaviors> 
        <behavior name="ExtractServiceBehavior">
          .....
        </behavior>
    </serviceBehaviors>
</behaviors>
<!-- Binding is the same as defined on the client -->
<binding name="ExtractService" ....
     ......
</binding>
<!-- Define all your services that you offer -->
<services>
    <service name="ExtractService"
             behaviorConfiguration="ExtractServiceBehavior">
        <endpoint name="ExtractService" 
            address="https://example.com/DataExtractService.asmx" 
            binding="basicHttpBinding" 
            bindingConfiguration="ExtractService" 
            contract="IExtractService" />
    </service>    
</services>    

Также: как правило, ваш контракт должен быть интерфейсом (IExtractService), а не конкретным классом, реализующим этот интерфейс.

person marc_s    schedule 26.06.2016
comment
Спасибо за подробности. Я определил тег сервера с соответствующим контрактом и т. д. Однако он по-прежнему дает ту же ошибку. Мне также интересно, как это работает в среде разработки? - person Anil Soman; 27.06.2016
comment
Разве конечные точки по умолчанию (WCF 4.0+) не сделают, если у вас нет раздела ‹services› в конфигурации на стороне сервера, тогда вы не выставили конечные точки для подключения, что неверно? - person Tim; 27.06.2016
comment
@Tim: вы, скорее всего, правы ..... Я все время забываю об этом, и, честно говоря, нахожу их более запутанными и неожиданно удивительными, чем явное определение моих конечных точек ..... - person marc_s; 27.06.2016
comment
Я наконец нашел причину. На самом деле на веб-сервере не было доступа в Интернет. После разрешения через наш прокси он заработал! Потому что мой служебный адрес является внешним IP. - person Anil Soman; 27.06.2016