在IIS上WCF多个端点并分别连接到它们

时间:2013-05-31 15:31:39

标签: c# wcf web-services iis

问题:

是否有某种方法可以访问一个端点而无需获取另一个端点的详细信息?那就是连接到已配置服务的一个端点,而不从服务的所有端点获取详细信息?

我使用同一个类配置了2个端点,两个不同的接口和两个不同的绑定。

Web服务在窗口7测试计算机上的IIS 7.5中托管

摘自web.config文件:

<bindings>
  <basicHttpBinding>
     <binding name="ServerUIBinding" 
              maxReceivedMessageSize="2097152" maxBufferSize="2097152" 
              sendTimeout="00:01:00" receiveTimeout="00:01:00">
     </binding>
     <binding name="ServerLinkBinding" 
              maxReceivedMessageSize="2097152" maxBufferSize="2097152"  
              sendTimeout="00:02:00" receiveTimeout="00:02:00">
     </binding>
  </basicHttpBinding>
</bindings>
<services>
  <service name="APOServiceLibrary.ServerUI"
           behaviorConfiguration="DefaultMetaDataBehaviour">
    <endpoint name="ServerUIEndPoint"
              address="/ServerUI"
              binding="basicHttpBinding"
              bindingConfiguration="ServerUIBinding"
              contract="APOServiceLibrary.IServerUI">
    </endpoint>
    <endpoint name="ServerLinkEndPoint"
              address="/ServerLink"
              binding="basicHttpBinding"
              bindingConfiguration="ServerLinkBinding"
              contract="APOServiceLibrary.IServerLink">
    </endpoint>
    <endpoint address="mexServer"
              binding="mexHttpBinding"
              contract="IMetadataExchange">
    </endpoint>
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior name="DefaultMetaDataBehaviour">
      <serviceMetadata httpGetEnabled="True"/>
      <serviceDebug includeExceptionDetailInFaults="False"/>
    </behavior>
  </serviceBehaviors>
</behaviors>

我已在ServerUI.svc文件中按如下方式配置服务:

<%@ ServiceHost Language="C#" Debug="true" Service="APOServiceLibrary.ServerUI" %>

当我连接到托管网站时(我设置它的方式,我可以使用以下网址连接:http://localhost/test/serverui.svc)使用WcfTestClient.exe工具,我可以正确地看到两端的细分如果我浏览http://localhost/test/ServerUI.svc?wsdl

,我同样可以看到wsdl定义

我在stackoverflow上一直在这里读到终点的地址字段(例如.address =“/ ServerLink”)是相对于IIS配置的网站而且应该可以连接到其中一个端点使用这种路径的点:

http://localhost/test/ServerUI.svc/ServerLink

但是,这似乎不适用于WcfTestClient.exe工具。那是我无法使用该工具连接到http://localhost/test/ServerUI.svc/ServerLink。我也无法在网络浏览器中浏览该网站。另外我尝试制作一个新的c#应用程序并使用该地址连接到Web服务,但它不起作用。每当我尝试这总是似乎产生这种类型的错误

  

错误:无法从中获取元数据无法从中获取元数据   http://localhost/test/ServerUI.svc/ServerLink如果这是Windows(R)   请访问您的Communication Foundation服务   检查您是否已在指定的位置启用元数据发布   地址。

所以,回到我的问题,是否有某种方法可以做到这一点?那只连接到其中一个端点并得到它的定义?我是否有与MetadataExchange分别为每个终点生成数据的不同之处?我可以配置.svc文件中的某些内容吗?

我想这样做的原因是为我们的其他团队提供一个“更干净”的界面,方法更少,对大型数据集超时不敏感(这是ServerLink的额外分钟超时)

我考虑过的解决方案是创建一个包装类并使用它创建一个单独的svc文件,以便使用完全独立的URL,但这似乎是一个糟糕的解决方案。

1 个答案:

答案 0 :(得分:3)

这是因为WCF测试客户端使用您的服务公开的mex端点来确定所有端点,并自动生成可以与您的端点通信的客户端。您无法将其指向单个端点地址,因为公开您的服务合同(IServerUIIServerLink)的端点不知道如何向潜在客户描述自己,他们只知道如何正确接受格式化请求并为其各自的合同发布格式正确的响应。

如果使用svcutil在Visual Studio中自动生成客户端代码,则适用相同的规则。您需要使用mex端点生成服务引用,而不是指向各个合同端点。 svcutil将自动为服务中的所有端点生成客户端代码。

当您配置实际客户端(WPF或其他)与您的服务通信时,他们的配置需要为应用需要与之通信的每个合同配置客户端端点。这些端点的address将是合同端点的实际地址,而不是元数据端点(例如http://localhost/test/ServerUI.svc/ServerLink

你自己说:

  

当我使用WcfTestClient.exe工具连接到托管站点(我设置它的方式,我可以使用以下URL连接:http://localhost/test/serverui.svc)时,我可以正确地看到两个端点的细分,如果我浏览http://localhost/test/ServerUI.svc?wsdl

,我也可以看到wsdl定义

这是测试客户端的正确和预期行为。现在,您可以向服务公开的所有端点发出呼叫。当您使用客户端调用其中一个端点时,它会将该请求发送到您期望的特定地址。