WCF服务在2个不同的服务合同露出2个端点(WCF service exposing 2 endpo

2019-08-03 15:03发布

我有我想配置,从而可以显示2个端点,指的不同功能,不同网址下的WCF服务。

我想拥有的是服务1,露出方法A,B,C,和服务2,露出方法d,E.我希望能够浏览这两个本地主机/ WebServiceName /服务1 / Service.svc本地主机/ WebServiceName /客服2 /服务.SVC。

引用本地主机/ WebServiceName /服务1 / Service.svc应该只能看到包含方法的接口的其他应用,B和C.他们不应该看到关于客服2接口什么。 而对于服务2同样。

到目前为止,我已经在我的WCF服务,I_Service1I_Service2定义了两个接口。

我在web.config中添加了两个端点,如下所示:

<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下的多个端点

不过,我仍然无法浏览本地主机/ WebServiceName /服务1 / 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. 

我可以成功地浏览本地主机/ WebServiceName / Service.svc和WSDL包括方法A,B,C,d,E但这应该是错在我想要的行为。

有什么事,我错过了什么?

UPDATE:本文继http://allen-conway-dotnet.blogspot.ro/2011/09/exposing-multiple-binding-types-for.html我对那些端点创建了两个不同的合同服务。 但目前,当我浏览它,我只seing 服务1。 客服2显然不存在(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>

Answer 1:

我一直在做这样的方式如下:设定一个“基址”为服务,并指定端点地址不同的文本追加到该基地的地址...

 <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 。 我可以看到你已经按照建议把完整的地址在端点地址,但所有我能说的是我已经做了这样的成功。



Answer 2:

就目前我解决这个问题纳入我的web服务的两个接口分隔两个.SVC文件。 这样,我本地主机/ WebServiceName / Service1.svc本地主机/ 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个不同的接口,但我可以用不同的凭据/令牌保护它们)。 但此刻,我会去用它。



Answer 3:

我试图让你描述的事情。 所有这一切都成功。 请do'nt生气,如果一些步骤是你明显。 所以:

  1. 创建WCF服务应用程序项目。
  2. 添加两个WCF服务项目(默认情况下会创建界面和SVC文件)。
  3. 创建Web应用程序项目。
  4. 添加两个服务引用使用“发现”按钮(两个Web服务应该是可见的)(右键单击Web应用程序项目==>添加服务引用)。
  5. 就这样。

默认情况下,我得到了以下的Web.config在Web应用程序项目:

     <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。



文章来源: WCF service exposing 2 endpoints on 2 different service contracts