0

问题:

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

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

Web 服务托管在 Windows 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当我使用该工具连接到托管站点(设置它的方式,我可以使用以下 URL 进行连接WcfTestClient.exe:)时,我可以正确看到两个端点的细分,如果我浏览,我同样可以看到 wsdl 定义至http://localhost/test/ServerUI.svc?wsdl

我一直在 stackoverflow 上读到,端点中的地址字段(例如 address="/ServerLink")与 IIS 配置的网站相关,并且应该可以使用它仅连接到一个端点路径类型:

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

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

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

那么,回到我的问题,有没有办法做到这一点?那就是只连接到一个端点并获得它的定义?MetadataExchange为了分别为每个端点生成数据,我需要做些什么不同的事情吗?.svc我可以配置文件中的内容吗?

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

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

4

1 回答 1

3

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

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

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

你自己说:

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

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

于 2013-05-31T16:04:32.347 回答