为什么WCF测试客户端工具在调试时只为多个端点显示单个端点baseAdress?

时间:2011-05-24 18:34:01

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

我的Windows Service托管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>  

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

任何人都知道为什么当单个服务暴露多个端点时,两个基地址都不会显示在WCF测试客户端工具中?

谢谢!

2 个答案:

答案 0 :(得分:0)

WcfTestClient基于您提供的MEX端点的传输来呈现服务。如果您提供基于HTTP的端点,它将显示该端点,给NET.TCP一个,这就是它所呈现的全部。

如果查看服务生成的WSDL,您将只找到该传输的端点描述。并不是WcfTestClient是有限的,它是WSDL。

答案 1 :(得分:0)

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

Multiple Base Addresses and Multiple Endpoints in WCF

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

WCF测试客户端在仅仅读取单个mex端点但仍然暴露两个主要服务端点的情况下,很好地准确表示了发生的情况。我不太喜欢在单个服务中使用多个绑定时客户端获取所有绑定配置的事实(这不是坏事,只是不是我想要的方式,因为我的场景中的客户端将会不能在单个应用程序中间切换绑定类型。)

总而言之,我将突破配置以使用单独的端点和它们自己的mex端点公开(2)服务,因此消费客户端(和WCF测试客户端)将仅为每个消耗的地址获得单个端点配置。 为了做到这一点,我必须做一些修改,因为2个服务配置不能指向相同的“服务名称”,这是实现合同的实际类。在我的场景中,由于两个服务仍将实现相同的合同,我需要一种方法来为它们提供唯一的名称。我添加了另外两个从原始契约继承的契约(每个服务1个)和2个从主实现类继承的新类。他们真的不做任何事情,只为WCF服务配置创建单独的占位符。然后,每个服务配置都具有新类的名称,允许它们是不同的。

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

稍微写下来:

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