2011-12-21 5 views
2

Я пытаюсь создать две службы WCF, которые должны иметь доступ друг к другу. Однако я получаю это сообщение об ошибке: На сервере возникла ошибка при обработке запроса. Сообщение об исключении: «Не удалось найти элемент конечной точки по умолчанию, который ссылается на контракт« AddonWCFService.IService1 »в разделе конфигурации клиента ServiceModel. Возможно, это связано с тем, что файл конфигурации не найден для вашего приложения или потому, что в элементе клиента не может найти элемент конечной точки, соответствующий этому контракту. '.Служба не может найти конечную точку другой службы в WCF

я называю метод Test() из этой службы

namespace CustomersService 
{ 
    [ServiceContract] 
    public interface ICustomers 
    { 
     [OperationContract] 
     [WebGet] 
     string Test(); 
    } 

    public class Customers : ICustomers 
    { 
     private int m_i = 0; 

     public int GetCounter() 
     { 
      return m_i; 
     } 

     public void Test() 
     { 
      AddonWCFService.Service1Client foo = new AddonWCFService.Service1Client(); 
     } 
    } 
} 

другой сервис

namespace AddonWCFWebservice 
{ 
    [ServiceContract] 
    public interface IService1 
    { 
     [OperationContract] 
     void Init(); 
    } 


    public class Service1 : IService1 
    { 
     public void Init() 
     { 

     } 
    } 
} 

Мой WebConfig:

<?xml version="1.0"?> 
<configuration> 
    <system.serviceModel> 
     <services> 

      <service behaviorConfiguration="MyserviceBehavior" name="CustomersService.Customers"> 
       <endpoint name="ws" address="ws" binding="wsHttpBinding" contract="CustomersService.ICustomers"/> 
       <endpoint name="" 
          address="" 
          binding="webHttpBinding" 
          contract="CustomersService.ICustomers" 
          behaviorConfiguration="WebBehavior"/> 
       <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
      </service> 
      <service name="AddonWCFWebservice.Service1" behaviorConfiguration="MyserviceBehavior"> 
       <endpoint address="" binding="wsHttpBinding" contract="AddonWCFWebservice.IService1"/> 
       <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
      </service> 
     </services> 
     <behaviors> 
      <serviceBehaviors> 
       <behavior name="MyserviceBehavior"> 
        <serviceMetadata httpGetEnabled="true"/> 
        <serviceDebug includeExceptionDetailInFaults="true"/> 
       </behavior> 
      </serviceBehaviors> 
      <endpointBehaviors> 
       <behavior name="WebBehavior"> 
        <webHttp /> 
       </behavior> 
      </endpointBehaviors> 
     </behaviors> 
    </system.serviceModel> 
    <system.web> 
     <compilation debug="true"/>   
     <customErrors mode="Off"/> 
    </system.web> 
</configuration> 

Обе службы находятся в одной и той же активной директории IIS. Я добавил ссылку на службу на проекты VS C#, используя веб-URL, например, http://www.foobar.baz/Test/Service1.svc и http://www.foobar.baz/Test/Customers.svc

Это, наверное, что-то очевидное, но я довольно новичок во всем бизнесе WCF. Благодаря!

Обновление: Решение заключалось в том, чтобы добавить клиентский раздел в мой webconfig. Кроме того, я использовал basicHttpBinding поверх wsHttpBinding, потому что моя безопасность будет отменена в другом месте, потому что это общедоступная служба. Я должен был соответствовать связывании клиента к связыванию разделе услуг: как BasicHttpBinding

<?xml version="1.0"?> 
<configuration> 
    <system.serviceModel> 
     <client> 
      <endpoint 
      name="" 
      address="http://demo.mydomain.baz/TestService/Service1.svc" 
      binding="basicHttpBinding" 
      contract="AddonWCFService.IService1" /> 
     </client> 

     <services> 
      <service behaviorConfiguration="MyserviceBehavior" name="CustomersService.Customers"> 
       <endpoint name="ws" address="ws" binding="wsHttpBinding" contract="CustomersService.ICustomers"/> 
       <endpoint name="" 
          address="" 
          binding="webHttpBinding" 
          contract="CustomersService.ICustomers" 
          behaviorConfiguration="WebBehavior"/> 
       <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
      </service> 
      <service name="AddonWCFWebservice.Service1" behaviorConfiguration="MyserviceBehavior"> 
       <endpoint address="" binding="basicHttpBinding" contract="AddonWCFWebservice.IService1"/> 
       <!-- 
       <endpoint address="" 
          binding="webHttpBinding" 
          contract="AddonWCFWebservice.IService1" 
          behaviorConfiguration="WebBehavior"/> 
       --> 
       <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
      </service> 


     </services> 
     <behaviors> 
      <serviceBehaviors> 
       <behavior name="MyserviceBehavior"> 
        <!-- 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"/> 
       </behavior> 
      </serviceBehaviors> 
      <endpointBehaviors> 
       <behavior name="WebBehavior"> 
        <webHttp /> 
       </behavior> 
      </endpointBehaviors> 
     </behaviors> 
    </system.serviceModel> 
    <system.web> 
     <compilation debug="true"/>   
     <customErrors mode="Off"/> 
    </system.web> 
</configuration> 

ответ

3

Проблема с вашей конфигурацией в том, что у вас нет клиентских конфигураций. У вас есть только серверные части. У вас должен быть клиентский номер с конечными точками. Взгляните сюда: http://msdn.microsoft.com/en-us/library/ms731745.aspx

Если вы не уверены в своих настройках, я бы посоветовал вам открыть вашу конфигурацию с помощью SvcConfigEditor.exe. Вы сразу увидите, что настроено. Вы можете найти его здесь: C: \ Program Files \ Microsoft SDK \ Windows \ v6.0A \ Bin \ SvcConfigEditor.exe. Если вы это сделаете - вы увидите, что клиентов нет.

+0

Правильно! Спасибо! Это сделал трюк. Не знал, что есть раздел клиента. Теперь я понимаю сообщение об ошибке, на самом деле совершенно ясно: «[...] раздел конфигурации клиента ServiceModel».Теперь, чтобы выяснить, как решить эту ошибку: «Конечная точка ChannelFactory должна иметь действительный адрес» – Nebula

+0

. Благодаря этому ответу мой код действительно работает прямо сейчас, см. Решение в вопросе. – Nebula

0

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

Эта линия здесь:

<endpoint address="" binding="wsHttpBinding" contract="AddonWCFWebservice.IService1"/>

определяет договор как "AddonWCFWebservice.IService1", когда это должно быть что-то вроде "AddonService.IService1" (без "ФОС").

+0

Я изменил пространство имен служебной ссылки на AddonWCFWebservice, как в моем файле проекта. Тем не менее ошибка остается, но теперь с «Не удалось найти элемент конечной точки по умолчанию, который ссылается на контракт« AddonWCFService.IService1 »в разделе конфигурации клиента ServiceModel». Как вы можете видеть, это IS является web.config. Имеет ли это отношение к тому, что обе службы находятся в одном и том же активном каталоге IIS? Любые указатели на то, как отладить это? – Nebula

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