Несколько базовых адресов и несколько конечных точек в WCF

Я использую две привязки TCP и HTTP. Я хочу предоставить данные mex для обеих привязок. Я хочу, чтобы mexHttpBinding предоставлял только службы HTTP, в то время как mexTcpBinding предоставлял только службы TCP. Или возможно, что я получаю доступ к службе статистики только через привязку HTTP, а к службе EventLogging через TCP?

Например:

  • Для 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>

person akif    schedule 08.03.2010    source источник
comment
Быстрый вопрос, почему вы хотите разделить конечные точки tcp и http по мексиканалу?   -  person Mikael Svenson    schedule 08.03.2010


Ответы (1)


Я хочу предоставить mex-данные для обеих привязок. Я хочу, чтобы mexHttpBinding предоставлял только службы HTTP, в то время как mexTcpBinding предоставлял только службы TCP. Или возможно, что я обращаюсь к службе статистики только через HTTP-привязку, а к службе eventLogging - через TCP?

Что ж, в этом случае вам нужно иметь две отдельные, разные службы - одну, которая предоставляет только 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.

person marc_s    schedule 08.03.2010
comment
Очень полезно. Я ошибался, говоря о наличии нескольких конечных точек в одной службе, соответствующих нескольким конечным точкам. Я подробно остановился на этом здесь: stackoverflow.com/questions/6115141/ - person atconway; 25.05.2011