WCF не может найти проблему конфигурации конечной точки - PullRequest
3 голосов
/ 06 февраля 2012

У меня есть веб-сервис с WCF, который я тестирую на своей локальной машине, который дает мне хэдшрейтер.

Мой сервис настроен так:

<system.serviceModel>
   <services>
      <service name="GHMDatroseIntegration.GHMDatroseWCFService.DatroseService" 
               behaviorConfiguration="DatroseServiceBehavior">
         <endpoint 
             address="mex"
             binding="basicHttpBinding" 
             contract="GHMDatroseIntegration.GHMDatroseWCFService.IDatroseService" />
      </service>
   </services>
   <behaviors>
      <serviceBehaviors>
         <behavior name="DatroseServiceBehavior">
            <serviceMetadata httpGetEnabled="true"/>
            <serviceDebug includeExceptionDetailInFaults="true"/>
            <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
         </behavior>
      </serviceBehaviors>
   </behaviors>
   <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>

Мой клиент настроен так:

<system.serviceModel>
   <bindings>
      <basicHttpBinding>
         <binding name="BasicHttpBinding_IDatroseService" 
             closeTimeout="00:02:00" openTimeout="00:01:00" 
             receiveTimeout="00:10:00" sendTimeout="00:02:00"
             allowCookies="false" bypassProxyOnLocal="false" 
             hostNameComparisonMode="StrongWildcard"
             maxBufferSize="524288" maxBufferPoolSize="524288" 
             maxReceivedMessageSize="524288" 
             messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
             useDefaultWebProxy="true">
            <readerQuotas 
                 maxDepth="32" maxStringContentLength="524288" 
                 maxArrayLength="524288" maxBytesPerRead="524288" 
                 maxNameTableCharCount="524288" />
            <security mode="None">
                 <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="" />
                 <message clientCredentialType="UserName" algorithmSuite="Default" />
            </security>
         </binding>
      </basicHttpBinding>
   </bindings>
   <client>
       <endpoint name="BasicHttpBinding_IDatroseService"
           address="http://localhost/DatroseWCFService/DatroseService.svc"  
           behaviorConfiguration="DatroseServiceBehavior"
           binding="basicHttpBinding"  
           bindingConfiguration="BasicHttpBinding_IDatroseService"
           contract="DatroseWCFService.IDatroseService"  />
   </client>
   <behaviors>
      <endpointBehaviors>
         <behavior name="DatroseServiceBehavior">
             <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
         </behavior>
      </endpointBehaviors>
   </behaviors>
 </system.serviceModel>

Я получаю ошибку:

Не было конечной точки прослушивания в http://localhost/DatroseWCFService/DatroseService.svc, которая могла бы принять сообщение. Это часто вызвано неправильным адресом или Действие SOAP. См. InnerException, если имеется, для более подробной информации.

... и все же, если я перехожу к местоположению, я получаю экран службы, поэтому он, кажется, настроен правильно.

Я уверен, что это связано с моей конфигурацией конечных точек, но я не могу понять, как они должны выглядеть. Некоторая помощь будет оценена здесь.

ОБНОВЛЕНИЕ whups Я поставил неправильное сообщение об ошибке. Это исправлено.

ОБНОВЛЕНИЕ 2 в соответствии с тем, что, как я полагаю, было предложено в этих ответах, я изменил свою конфигурацию сервера на:

<system.serviceModel>
   <services>
      <service name="GHMDatroseIntegration.GHMDatroseWCFService.DatroseService" 
               behaviorConfiguration="DatroseServiceBehavior">
         <endpoint 
             address="/svc"
             binding="basicHttpBinding"
             contract="GHMDatroseIntegration.GHMDatroseWCFService.IDatroseService"  />
         <endpoint 
             address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
       </service>
   </services>
   <behaviors>
       <serviceBehaviors>
          <behavior name="DatroseServiceBehavior">
             <serviceMetadata httpGetEnabled="true"/>
             <serviceDebug includeExceptionDetailInFaults="true"/>
             <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
          </behavior>
       </serviceBehaviors>
   </behaviors>
   <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>

и моя конфигурация клиента:

<system.serviceModel>
   <bindings>
      <basicHttpBinding>
         <binding name="BasicHttpBinding_IDatroseService" 
             closeTimeout="00:02:00" openTimeout="00:01:00" 
             receiveTimeout="00:10:00" sendTimeout="00:02:00"
             allowCookies="false" bypassProxyOnLocal="false" 
             hostNameComparisonMode="StrongWildcard"
             maxBufferSize="524288" maxBufferPoolSize="524288" 
             maxReceivedMessageSize="524288"
             messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
             useDefaultWebProxy="true">
          <readerQuotas 
              maxDepth="32" maxStringContentLength="524288" maxArrayLength="524288"
              maxBytesPerRead="524288" maxNameTableCharCount="524288" />
          <security mode="None">
              <transport clientCredentialType="None" proxyCredentialType="None"
                        realm="" />
              <message clientCredentialType="UserName" algorithmSuite="Default" />
          </security>
       </binding>
     </basicHttpBinding>
   </bindings>
   <client>
      <endpoint name="BasicHttpBinding_IDatroseService" 
          address="http://localhost/DatroseWCFService/DatroseService.svc/svc" 
          behaviorConfiguration="DatroseServiceBehavior"
          binding="basicHttpBinding" 
          bindingConfiguration="BasicHttpBinding_IDatroseService"
          contract="DatroseWCFService.IDatroseService" />
   </client>
   <behaviors>
      <endpointBehaviors>
         <behavior name="DatroseServiceBehavior">
            <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
         </behavior>
      </endpointBehaviors>
   </behaviors>
</system.serviceModel>

и когда я запускаю это, я получаю ошибку 400 (неверный запрос). Я не уверен, что это шаг вперед или шаг назад. Я создал новую проблему, или я очистил свой путь к следующей проблеме?

ОБНОВЛЕНИЕ 3

По совету niao, я изменил это для конфигурации сервера:

<system.serviceModel>
    <services>
        <service name="GHMDatroseIntegration.GHMDatroseWCFService.DatroseService" behaviorConfiguration="DatroseServiceBehavior">
            <endpoint contract="GHMDatroseIntegration.GHMDatroseWCFService.IDatroseService" binding="basicHttpBinding" address="http://localhost/DatroseWCFService/DatroseService.svc"/>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        </service>
    </services>
    <behaviors>
        <serviceBehaviors>
            <behavior name="DatroseServiceBehavior">
                <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
                <serviceMetadata httpGetEnabled="true"/>
                <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
                <serviceDebug includeExceptionDetailInFaults="true"/>
                <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>

... однако, когда я перешел по этому адресу, я получил желтый экран смерти:

Ошибка сервера в приложении '/ DatroseWCFService'.
Когда 'system.serviceModel / serviceHostingEnvironment / multipleSiteBindingsEnabled' в конфигурации установлено значение true, конечные точки должны указывать относительный адрес. Если вы указываете относительный URI прослушивания на конечная точка, то адрес может быть абсолютным. Чтобы исправить эту проблему, укажите относительный URI для конечной точки «http://localhost/DatroseWCFService/DatroseService.svc'.

... итак, я попытался сделать его относительным путем, вот так:

<endpoint 
   address="localhost/DatroseWCFService/DatroseService.svc"
   binding="basicHttpBinding" 
   contract="GHMDatroseIntegration.GHMDatroseWCFService.IDatroseService" />

... но после публикации я получаю ошибку 404. Конечная точка клиента настроена так:

<endpoint name="BasicHttpBinding_IDatroseService"
    address="http://localhost/DatroseWCFService/DatroseService.svc" 
    behaviorConfiguration="DatroseServiceBehavior"
    binding="basicHttpBinding" 
    bindingConfiguration="BasicHttpBinding_IDatroseService"
    contract="DatroseWCFService.IDatroseService"  />

ОБНОВЛЕНИЕ 4 По совету marc_s, я удалил конфигурацию привязки из клиента, поэтому мой конфигурационный файл выглядит так:

<system.serviceModel>
    <client>
        <endpoint address="http://localhost/DatroseWCFService/DatroseService.svc" behaviorConfiguration="DatroseServiceBehavior"
         binding="basicHttpBinding" 
         contract="DatroseWCFService.IDatroseService" name="BasicHttpBinding_IDatroseService" />
    </client>
    <behaviors>
        <endpointBehaviors>
            <behavior name="DatroseServiceBehavior">
                <dataContractSerializer maxItemsInObjectGraph="10000000"/>
            </behavior>
        </endpointBehaviors>
    </behaviors>
</system.serviceModel>

и моя конфигурация сервера выглядит следующим образом:

<system.serviceModel>
    <services>
        <service name="GHMDatroseIntegration.GHMDatroseWCFService.DatroseService" behaviorConfiguration="DatroseServiceBehavior">
            <endpoint contract="GHMDatroseIntegration.GHMDatroseWCFService.IDatroseService" binding="basicHttpBinding" address=""/>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        </service>
    </services>
    <behaviors>
        <serviceBehaviors>
            <behavior name="DatroseServiceBehavior">
                <serviceMetadata httpGetEnabled="true"/>
                <serviceDebug includeExceptionDetailInFaults="true" httpsHelpPageEnabled="true" httpHelpPageEnabled="true"/>
                <dataContractSerializer maxItemsInObjectGraph="10000000"/>
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>

Я больше не получаю ошибку 404.

Тем не менее, я получаю 400 (ProtocolException, Bad Request) без какой-либо назидательной информации о том, что он получил или почему он плохой. Я ожидаю, что перешел за пределы проблемы с конечной точкой, в совершенно новый ад, лишенный конфигурации услуг.

ОБНОВЛЕНИЕ 5

По запросу «скелет» моего сервиса (полагаю, интерфейс подойдет?):

[ServiceContract]
public interface IDatroseService
{

    [OperationContract]
    bool SubmitPayableTransaction(List<InvoiceItem> invoices);

    [OperationContract]
    Dictionary<string, bool> ValidateAccounts(List<string> accounts);

    [OperationContract]
    Dictionary<string, int> GetVendor1099Types(List<string> vendors);

    [OperationContract]
    Dictionary<string, string> GetPaymentTerms(List<string> vendors);

}

1 Ответ

16 голосов
/ 07 февраля 2012

Итак, я предполагаю, что ваша служба размещена внутри IIS, верно ??

Итак, виртуальный каталог, в котором живет *.svc, в основном определяет адрес вашей службы - так ли этот адрес правильный?

Кроме того: у вас есть «относительный» адрес mex в конечной точке службы

<endpoint 
    address="mex" 

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

В любом случае - с этим постоянным адресом ваш полный адрес обслуживания становится:

http://yourserver/DatroseWCFService/DatroseService.svc/mex

Что если вы позвоните в свою службу пона этот адрес - вы получаете ответ ??

Обновление: не знаете, как вы пытаетесь это проверить.Это веб-служба SOAP - вы увидите «целевую страницу» (страницу «справки») для службы в своем браузере, но для тестирования самой службы вам необходимо использовать средство тестирования с поддержкой SOAP (например, * 1029).* Тестовый клиент WCF или SoapUI ) - вы не можете протестировать веб-сервис SOAP, просто перейдя по его веб-адресу.
( хорошо, так что вы тестируете это, вызывая сервис из тестового приложения - это, безусловно, должно работать! )

Обновление № 2: поскольку вы размещаете его в IIS (верно?), адрес вашей службы в основном определяется виртуальным каталогом, в котором находится ваш файл * .svc.Поэтому моя следующая попытка будет такой: просто пусть этот адрес будет вашим сервисным адресом.

Измените конфигурацию на стороне сервиса на:

<service name="GHMDatroseIntegration.GHMDatroseWCFService.DatroseService" 
         behaviorConfiguration="DatroseServiceBehavior">
   <endpoint 
       address=""   <!-- define nothing here - just let the *.svc file determine your service address -->
       binding="basicHttpBinding" 
       contract="GHMDatroseIntegration.GHMDatroseWCFService.IDatroseService" />
   <endpoint 
       address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>

и ваш config на стороне клиента to:

<endpoint name="BasicHttpBinding_IDatroseService"
    address="http://localhost/DatroseWCFService/DatroseService.svc" 
    behaviorConfiguration="DatroseServiceBehavior"
    binding="basicHttpBinding" 
    bindingConfiguration="BasicHttpBinding_IDatroseService"
    contract="DatroseWCFService.IDatroseService"  />

Это работает ??

Следующая попытка будет использовать конфигурацию на стороне клиента без значения bindingConfiguration= - так как эточто вы делаете на сервере тоже - просто абсолютно голые basicHttpBinding без любых модификаций - это работает ??

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