WCF中的多个基址和多个端点

时间:2010-03-08 07:27:00

标签: c# .net wcf base-address

我正在使用两个绑定TCP和HTTP。我想在两个绑定上提供 mex 数据。 我想要的是mexHttpBinding只暴露HTTP服务,而mexTcpBinding只暴露TCP服务。或者,我是否可以仅通过HTTP绑定和来自TCP的 eventLogging 服务访问 stats 服务?

例如:

  • 对于TCP,我应该只有

    net.tcp://localhost:9001/ABC/mex
    net.tcp://localhost:9001/ABC/eventLogging
    
  • 对于HTTP

    http://localhost:9002/ABC/stats
    http://localhost:9002/ABC/mex
    

当我连接任何基地址(使用WCF测试客户端)时,我能够访问所有服务吗?就像当我连接 net.tcp:// localhost:9001 / ABC 时,我可以使用HTTP绑定提供的服务。为什么会这样?

<system.serviceModel>
  <services>
    <service behaviorConfiguration="ABCServiceBehavior" name="ABC.Data.DataServiceWCF">
      <endpoint address="eventLogging" binding="netTcpBinding" contract="ABC.Campaign.IEventLoggingService" />
      <endpoint address="mex" binding="mexTcpBinding" bindingConfiguration="" contract="IMetadataExchange" />
      <endpoint address="stats" binding="basicHttpBinding" contract="ABC.Data.IStatsService" />
      <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      <host>
        <baseAddresses>
          <add baseAddress="net.tcp://localhost:9001/ABC" />
          <add baseAddress="http://localhost:9002/ABC" />
        </baseAddresses>
      </host>
    </service>
  </services>
  <behaviors>
    <serviceBehaviors>
      <behavior name="ABCServiceBehavior">
        <serviceMetadata httpGetEnabled="false" />
        <serviceDebug includeExceptionDetailInFaults="true" />
      </behavior>
    </serviceBehaviors>
  </behaviors>
</system.serviceModel>

1 个答案:

答案 0 :(得分:4)

  

我想在两者上提供mex数据   绑定。我想要的是那个   mexHttpBinding只暴露HTTP   服务而mexTcpBinding   仅公开TCP服务。或者是这个   我可以访问统计服务   仅来自HTTP绑定和   来自TCP的eventLogging服务?

嗯,在这种情况下,您需要有两个独立的,不同的服务 - 一个仅公开eventLogging,另一个仅公开stats

当你有两个单独的服务时,你可以通过HTTP公开一个服务,它的mex只显示那些方法,另一个通过TCP / IP显示它们的方法。

<services>
  <service name="ABC.Data.DataServiceWCFEventlogging"
           behaviorConfiguration="ABCServiceBehavior" >
    <endpoint address="eventLogging" 
              binding="netTcpBinding" 
              contract="ABC.Campaign.IEventLoggingService" />
    <endpoint address="mex" 
              binding="mexTcpBinding" 
              contract="IMetadataExchange" />
    <host>
       <baseAddresses>
         <add baseAddress="net.tcp://localhost:9001/ABC" />
       </baseAddresses>
     </host>
  </service>
  <service name="ABC.Data.DataServiceWCFStats"
           behaviorConfiguration="ABCServiceBehavior" >
     <endpoint address="stats" 
               binding="basicHttpBinding" 
               contract="ABC.Data.IStatsService" />
     <endpoint address="mex" 
               binding="mexHttpBinding" 
               contract="IMetadataExchange" />
     <host>
        <baseAddresses>
           <add baseAddress="http://localhost:9002/ABC" />
        </baseAddresses>
     </host>
  </service>
</services>

如果在同一服务上同时使用这两种方法,则无法通过http和另一部分通过tcp / ip公开部分方法。