Служба WCF предоставляет 2 конечные точки в 2 разных контрактах на обслуживание

у меня есть служба WCF, которую я пытаюсь настроить так, чтобы она предоставляла 2 конечные точки, ссылаясь на разные функции, под разными URL-адресами.

что я хочу-это Service1, разоблачая методы A, B, C и службы service2, разоблачая методы D, E. Я хочу иметь возможность просматривать как localhost/WebServiceName/Service1 / Service.svc и localhost/WebServiceName/Service2 / Service.svc.

другой применения ссылок localhost/WebServiceName/Service1 / Service.svc должен видеть только интерфейс, содержащий методы A, B и C. Они не должны видеть ничего относительно службы service2 интерфейс. И за службы service2 дополнительно.

до сих пор я определил два интерфейса в моей службе WCF,I_Service1 и I_Service2.

я добавил две конечные точки в моей сети.конфиг как Итак:

<endpoint address="http://localhost/WebServiceName/Service1/" binding="wsHttpBinding" contract="WebServiceName.I_Service1" bindingConfiguration="Binding1" />
<endpoint address="http://localhost/WebServiceName/Service2/" binding="wsHttpBinding" contract="WebServiceName.I_Service2" bindingConfiguration="Binding2" />  

предложение использовать полный адрес в enpoint исходит отсюда:несколько конечных точек в IIS

но все же, я не могу просматривать localhost/WebServiceName/Service1 / Service.svc. Получаю:

Description: HTTP 404. The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, or is temporarily unavailable.  Please review the following URL and make sure that it is spelled correctly. 

Я могу успешно просмотреть localhost/WebServiceName / Service.svc и wsdl включает методы A, B, C, D, E. Но это должно быть неправильно в поведении, которое я хочу.

есть то, что я пропустил?

обновление: после этой статьи http://allen-conway-dotnet.blogspot.ro/2011/09/exposing-multiple-binding-types-for.html я создал две разные службы контрактов для этих конечных точек. Но в настоящее время я вижу только Service1 когда я просматриваю его. службы service2 по-видимому, не существует (появляются проблемы, связанные с ошибкой HTTP 404).

конфигурация выглядит так:

<services>
   <service behaviorConfiguration="WebServiceName.ServiceBehavior1" name="WebServiceName.Service1">
    <endpoint address="" binding="wsHttpBinding" bindingConfiguration="Binding1"
     contract="WebServiceName.I_Service1" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
     <host>
       <baseAddresses>
         <add baseAddress="http://localhost/WebServiceName/Service1/Service.svc" />
       </baseAddresses>
     </host>
   </service>
   <service behaviorConfiguration="WebServiceName.ServiceBehavior2" name="WebServiceName.Service2">
    <endpoint address="" binding="wsHttpBinding" bindingConfiguration="Binding1"
     contract="WebServiceName.I_Service2" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
     <host>
       <baseAddresses>
         <add baseAddress="http://localhost/WebServiceName/Service2/Service.svc" />
       </baseAddresses>
     </host>
   </service>
  </services>

3 ответов


способ, которым я всегда это делал, заключается в следующем: установите один "базовый адрес" для службы и укажите адреса конечных точек как другой текст для добавления к этому базовому адресу...

 <service name="MyNamespace.MyService">
    <endpoint address="FirstEndpointAddress" binding="netTcpBinding"
      name="FirstEndpointName"
      contract="MyNamespace.FirstEndpointContract" />
    <endpoint address="SecondEndpointAddress" binding="netTcpBinding"
      name="SecondEndpointName"
      contract="MyNamespace.SecondEndpointContract" />
    <host>
      <baseAddresses>
        <add baseAddress="net.tcp://localhost:8733/MyBaseAddress" />
      </baseAddresses>
    </host>
  </service>

так что в вашем случае базовый адрес может быть localhost/WebServiceName и адрес конечной точки для конечной точки 1 может быть Service1/Service.svc. Аналогично для конечной точки 2 это может быть Service2/Service.svc. Я вижу, что вы последовали совету поместить полный адрес в адрес конечной точки, но все, что я могу сказать, это то, что я сделал это путь к успеху.


Я попытался сделать то, что вы описали. Все это удается. Пожалуйста, не сердитесь, если некоторые шаги очевидны для вас. Итак:

  1. создать проект приложения Службы WCF.
  2. добавить два элемента службы WCF (по умолчанию будет create interface и svc file).
  3. создать проект веб-приложения.
  4. добавить две ссылки на службу (щелкните правой кнопкой мыши на Web App Project = = > добавить ссылку на службу) с помощью кнопки "Discover" (две веб-службы должна быть видимой.)
  5. вот и все.

по умолчанию я получил следующий веб.config в проекте веб-приложения:

     <system.serviceModel>
<bindings>
  <basicHttpBinding>
    <binding name="BasicHttpBinding_IService1" closeTimeout="00:01:00"
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
      allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
      maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
      messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
      useDefaultWebProxy="true">
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <security mode="None">
        <transport clientCredentialType="None" proxyCredentialType="None"
          realm="" />
        <message clientCredentialType="UserName" algorithmSuite="Default" />
      </security>
    </binding>
    <binding name="BasicHttpBinding_IService2" closeTimeout="00:01:00"
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
      allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
      maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
      messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
      useDefaultWebProxy="true">
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <security mode="None">
        <transport clientCredentialType="None" proxyCredentialType="None"
          realm="" />
        <message clientCredentialType="UserName" algorithmSuite="Default" />
      </security>
    </binding>
  </basicHttpBinding>
</bindings>
<client>
  <endpoint address="http://localhost:3597/Service1.svc" binding="basicHttpBinding"
    bindingConfiguration="BasicHttpBinding_IService1" contract="ServiceReference1.IService1"
    name="BasicHttpBinding_IService1" />
  <endpoint address="http://localhost:3597/Service2.svc" binding="basicHttpBinding"
    bindingConfiguration="BasicHttpBinding_IService2" contract="ServiceReference2.IService2"
    name="BasicHttpBinding_IService2" />
</client>

вы можете попробовать перестроить проект WCF и обновить WebReferences.


на данный момент мое решение этой проблемы включает два .svc-файлы в моем веб-сервисе для разделения двух интерфейсов. Такие у меня localhost/WebServiceName / Service1.svc и localhost/WebServiceName / Service2.svc.

настройки конечной точки

<services>
   <service behaviorConfiguration="WebServiceName.ServiceBehavior1" name="WebServiceName.Service1">
    <endpoint address="" binding="wsHttpBinding" bindingConfiguration="Binding1"
     contract="WebServiceName.I_Service1" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
     <host>
       <baseAddresses>
         <add baseAddress="http://localhost/WebServiceName/Service1.svc" />
       </baseAddresses>
     </host>
   </service>
   <service behaviorConfiguration="WebServiceName.ServiceBehavior2" name="WebServiceName.Service2">
    <endpoint address="" binding="wsHttpBinding" bindingConfiguration="Binding2"
     contract="WebServiceName.I_Service2" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
     <host>
       <baseAddresses>
         <add baseAddress="http://localhost/WebServiceName/Service1.svc" />
       </baseAddresses>
     </host>
   </service>
  </services>

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