【问题标题】:Why does the WCF Test Client tool only display a single endpoint baseAdress for multiple endpoints when debugging?为什么 WCF 测试客户端工具在调试时只为多个端点显示单个端点 baseAdress?
【发布时间】:2011-05-24 18:34:00
【问题描述】:

我的 Windows 服务托管 WCF 服务具有以下配置:

    <services>      
  <service name="MyService" behaviorConfiguration="MyServiceBehavior">        
    <endpoint address="" 
              binding="netTcpBinding" 
              bindingConfiguration="WindowsClientOverTcp"
              name="WindowsClientOverTcp" 
              contract="IMyService" />
    <endpoint address=""
              binding="wsHttpBinding"
              bindingConfiguration="WindowsClientOverHttps"
              name="WindowsClientOverHttps"
              contract="IMyService">         
    </endpoint>

    <endpoint address="mex" 
              binding="mexTcpBinding" 
              contract="IMetadataExchange" />
    <endpoint address="mex"
              binding="mexHttpsBinding"
              contract="IMetadataExchange" />
    <host>
      <baseAddresses>
        <add baseAddress="https://MyMachine:8250/Services/MyService/Https" />
        <add baseAddress="net.tcp://MyMachine:8250/Services/MyService/tcp" />
      </baseAddresses>
    </host>        
  </service>  

1st:一切正常。不过我有一个问题。当开始在 VS.NET 2010 中调试服务并出现“WCF 测试客户端”工具时,树的顶部仅显示单个“net.tcp://MyMachine:8250/Services/MyService/tcp”地址导航,并且两个端点都显示为子元素(WindowsClientOverTcp 和 WindowsClientOverHttps)。现在两个基地址都是消耗品可用,所以没有大问题。但是,为什么它只显示工具中的单个地址?我认为这可能是 .config 中显示的顺序,所以我切换了它们,但这并没有改变任何东西。

有谁知道当一个服务暴露多个端点时,为什么两个基地址都没有显示在 WCF 测试客户端工具中?

谢谢!

【问题讨论】:

  • 好吧,补充一下,我了解显示单个地址的原因。它与我要公开的 mex 端点有关。我可能只需要一个服务的元数据端点,mex http 端点就足够了(我认为)。根据我在 .config 中实际拥有 mex 端点的顺序(永远是第一个),确定 WCF 测试客户端的根中显示哪个端点地址。

标签: .net wcf visual-studio-2010 debugging


【解决方案1】:

WcfTestClient 正在根据您为其提供的 MEX 端点的传输来呈现服务。如果你给基于 HTTP 的端点,它将呈现那个,给 NET.TCP 一个,这就是它呈现的全部。

如果您查看服务生成的 WSDL,您会发现只有该传输的端点描述。限制的不是 WcfTestClient,而是 WSDL。

【讨论】:

  • 如果您查看我的配置,我提供了两个 mex 端点:mexTcpBinding 和 mexHttpsBinding。它如何决定展示哪一个?
  • 它会根据您为服务提供的“URL”传输来选择它。如果是 http://.... 你会得到那个 only
  • 您能详细说明一下吗?请帮我一下。现在,我在测试客户端中看到了“net.tcp”,但我没有看到我在“URL 传输”中设置的位置,如您所描述的。你能指出我正确的方向吗?
  • “传输”是指端点地址的 http:// 或 net.tcp:// 部分。我认为您假设 WcfTestClient 中的单个节点代表单个服务(及其所有端点),而其中仅代表 单个端点。在 WcfTestClient 中尝试此操作,从“文件”菜单中选择“添加服务”。在对话框中,输入您的 http://... 端点 URL,然后单击确定。接下来,再次从 File 菜单中选择 Add Service 并输入 net.tcp://... 端点地址。单击“确定”后,您应该会在“我的服务项目”树中看到两个节点。希望这可以解决问题。
  • 我实际上确定了原始问题的根本解释,并在顶部发表了评论。它必须严格与我的配置中的 mex 端点有关。似乎 .config 中的第一个是在测试客户端中显示的那个。拥有超过 1 个 mex 端点没有错误,但显然,它仍然显示为单个服务,选择通过第一个配置的 mex 端点公开的地址。
【解决方案2】:

这个帖子的答案包含我原来问题的答案:

Multiple Base Addresses and Multiple Endpoints in WCF

我很困惑,我可以创建一个具有多个端点和多个 mex 端点的 single 服务,以仍然像两个服务一样执行相同的合同。但是我不喜欢这样,因为当您使用我的服务(通过 net.tcp 或 https)both 端点配置被添加到客户端。我想我要做的是创建 2 个不同的服务配置,每个仍然实现相同的合同,但只是具有唯一的名称和绑定。

WCF 测试客户端在仅读取单个 mex 端点的基础上准确地表示正在发生的事情,但仍然公开了两个主要服务端点。我真的不喜欢客户端在单个服务中使用多个绑定时获得所有绑定配置的事实(这不是一件坏事,只是不是我想要的方式,因为我的场景中的客户端会不能在单个应用程序中途切换绑定类型)。

因此,总而言之,我将分解配置以公开 (2) 具有单独端点和它们自己的 mex 端点的服务,因此消费客户端(和 WCF 测试客户端)将只获得每个消费地址的单个端点配置。 为了做到这一点,尽管我必须进行一些修改,因为 2 个服务配置不能指向相同的“服务名称”,这是实现合同的实际类。在我的场景中,因为这两个服务仍然会实现相同的合同,所以我需要一种方法来给它们提供唯一的名称。我添加了 2 个从原始合同继承的合同(每个服务 1 个)和 2 个从主实现类继承的新类。除了为 WCF 服务配置创建单独的占位符之外,它们实际上什么都不做。然后每个服务配置都有新类的名称,使它们能够不同。

现在使用此配置,WCF 测试客户端将每个主要服务端点显示为自己的实体。如果您不介意客户端获取单个服务的所有端点配置,则不必再次执行此操作,但在我的情况下,我想要不同的服务地址,以及它们的单个下载配置,但是仍在执行相同的整体合同。

写一点:

在 WCF 中为同一服务类公开多个绑定类型:
http://allen-conway-dotnet.blogspot.com/2011/09/exposing-multiple-binding-types-for.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    相关资源
    最近更新 更多