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

本文关键字:连接 端点 IIS WCF | 更新日期: 2023-09-27 18:16:13

问题:

有没有办法访问一个端点而不获取另一个端点的详细信息?就是连接到已配置服务的一个端点,而不从该服务的所有端点获取详细信息?

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

web服务托管在Windows7测试机上的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" %>

当我使用WcfTestClient.exe工具连接到托管站点时(按照我的设置方式,我可以使用以下URL连接:http://localhost/test/serverui.svc(,我可以正确地看到两个端点的细分,如果我浏览到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,但这似乎是一个糟糕的解决方案。

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

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

如果在Visual Studio中使用svcutil自动生成客户端代码,则同样的规则也适用。您将需要使用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定义

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