1

我正在使用两个绑定 TCP 和 HTTP。我想提供两个绑定的mex数据。我想要的是 mexHttpBinding 只公开 HTTP 服务,而 mexTcpBinding 只公开 TCP 服务。或者这可能是我只从 HTTP 绑定和TCP的eventLogging服务访问统计服务吗?

例如:

  • 对于 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>
4

1 回答 1

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 公开另一部分。

于 2010-03-08T15:24:18.030 回答