2012-02-06 1 views
3

У меня есть веб-сервис с WCF. Я тестирую свою локальную машину, которая дает мне голову.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, если имеется.

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

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

UPDATE whups Я ввел неправильное сообщение об ошибке. Он исправлен.

UPDATE 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 (плохой запрос). Я не уверен, что это шаг вперед или шаг назад. Я создал новую проблему, или я очистил свой путь к следующей проблеме?

UPDATE 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" /> 

UPDATE 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) без какой-либо назидательной информации о том, что он получил или почему это плохо. Я ожидаю, что я перешел за пределы проблемы с конечной точкой, в совершенно новую пустоту адского сервиса.

UPDATE 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); 

} 
+0

Ваш веб-сервис находится на порту 80?!? – deltree

+0

Я столкнулся с этой проблемой. Один полезный элемент - использовать скрипач. Он может запросить crossdomainpolicy.xml (имя может быть заметно другим), что приведет к его провалу. Кроме того, я неправильно сконфигурировал подключение к базе данных, в результате чего возникла ошибка, и поэтому служба не прослушивала. Попробуйте найти эти типы элементов, чтобы узнать, вызывает ли это это. Ваша конфигурация службы может быть правильной, но что-то еще может быть неправильным. –

+0

укажите адрес конечной точки (http: //localhost/DatroseWCFService/DatroseService.svc) файл web.config сервера - http://msdn.microsoft.com/en-us/library/ms733749.aspx –

ответ

16

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

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

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

<endpoint 
    address="mex" 

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

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

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

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

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

Update # 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> 

и ваш стороне клиента конфигурации к:

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

ли эту работу ??

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

+0

+1 Я почти закончил писать ответ :) проблема в том, что у него только конечная точка mex, фактическое обслуживание отсутствует –

+0

веб-служба отвечает на 'http: // локальный/DatroseWCFService/DatroseService.svc'. Как должен выглядеть мой адрес? Blank? что-то другое? Должен признаться, я просто следил за «практическими» руководствами, которые я нашел в Интернете, это просто застенчиво относится ко мне. –

+0

См. Мое обновление. –

 Смежные вопросы

  • Нет связанных вопросов^_^