无法使用netTcpRelayBinding公开mex端点

时间:2015-12-29 11:50:40

标签: c# wcf azure azureservicebus azure-servicebusrelay

我有一个WCF服务,我使用天蓝色服务总线中继消费。我试图公开mex端点,但我遇到了这个错误

  

无法找到与端点的方案sb匹配的基址   绑定NetTcpRelayBinding。注册的基地址方案是   [HTTP]。

我的配置文件看起来像这样,我在这里做错了什么?

<system.serviceModel>
      <bindings>
         <netTcpRelayBinding>
            <binding name="default">
               <security mode="None" />
            </binding>
         </netTcpRelayBinding>
      </bindings>
      <extensions>
         <behaviorExtensions>
            <add name="transportClientEndpointBehavior" type="Microsoft.ServiceBus.Configuration.TransportClientEndpointBehaviorElement, Microsoft.ServiceBus, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
            <add name="serviceRegistrySettings" type="Microsoft.ServiceBus.Configuration.ServiceRegistrySettingsElement, Microsoft.ServiceBus, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
         </behaviorExtensions>
         <bindingExtensions>
            <!--<add name="basicHttpRelayBinding" type="Microsoft.ServiceBus.Configuration.BasicHttpRelayBindingCollectionElement, Microsoft.ServiceBus, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>-->
            <add name="netTcpRelayBinding" type="Microsoft.ServiceBus.Configuration.NetTcpRelayBindingCollectionElement, Microsoft.ServiceBus, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
         </bindingExtensions>
      </extensions>
      <services>
         <service behaviorConfiguration="serviceMetadata" name="Namespace.TestService">
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
            <endpoint address="sb://[my namespace].servicebus.windows.net/Test" behaviorConfiguration="sbTokenProvider" binding="netTcpRelayBinding" bindingConfiguration="default" contract="Namespace.ITestContract" />
            <endpoint name="MexEndpoint" contract="IMetadataExchange" binding="netTcpRelayBinding" bindingConfiguration="default" address="mex" />       
      </service>
      </services>
      <behaviors>
         <serviceBehaviors>
            <behavior name="serviceMetadata">
               <serviceMetadata />
            </behavior>
         </serviceBehaviors>
         <endpointBehaviors>
            <behavior name="sbTokenProvider">
               <transportClientEndpointBehavior>
                  <tokenProvider>
                     <sharedAccessSignature keyName="RootManageSharedAccessKey" key="[key]" />
                  </tokenProvider>
               </transportClientEndpointBehavior>
               <serviceRegistrySettings discoveryMode="Public" />
            </behavior>
         </endpointBehaviors>
      </behaviors>
   </system.serviceModel>

2 个答案:

答案 0 :(得分:1)

这有点棘手,因为在WCF中公开mex端点的模型有点不幸被内联到服务本身。使用Service Bus,您无法在另一个侦听器的范围内侦听端点侦听器。

技巧是使服务端点和mex端点并排放置而不是嵌套,共享一个公共基地址,例如,在https://example.servicebus.windows.net/mysvc下方,您将拥有&#34; service&#34;和&#34; mex&#34;并排侧。

我正在更新Relay示例,因此这个版本的自述文件仍然需要重写,并且它还不能保证可以正常工作,但是你可能想看一看App.config and at the Program.cs here。如果要为NetTcp服务公开MEX,则需要https://和sb://前缀基地址。

该示例还说明了如何修复服务调试行为的帮助页面。

答案 1 :(得分:0)

你需要声明一个与mexHttpBinding兼容的基地址(顺便说一下http)。 2种解决方案是可能的:

1 /在主机部分的服务部分添加baseAddress,如下所示:

<service ...>
   ...
   <host>
      <baseAddresses>
          <add baseAddress="http://localhost:8080/Test" />
      </baseAddresses>
   </host>
</service>

您的mex端点将在http://localhost:8080/Test/mex上收听。

2 / - 或 - 只需在mex端点添加完整地址。

<endpoint address="http://[namespace].servicebus.windows.net/Test/mex" binding="mexHttpBinding" contract="IMetadataExchange"/>