Относительный адрес конечной точки WCF, доступный по всем базовым адресам, независимо от используемой привязки - PullRequest
0 голосов
/ 14 марта 2011

У меня есть этот сервис.В app.config у меня определены два базовых адреса.Один для http и один для net.tcp.

Один контракт выставляется через две конечные точки, одна с базовым HttpBinding, а другая с netTcpBinding.

Теперь странно то, что обе конечные точкидоступны на обоих базовых адресах.Если я подключаюсь к любой конечной точке с помощью приложения wcfclient.exe, обе конечные точки отображаются.Т.е. basicHttpBinding через net.tcp и наоборот.

Почему это так и я могу с этим что-нибудь сделать?

Конфиг для справки.

<configuration>
<system.serviceModel>
<services>
  <service name="FileServer.BookService" behaviorConfiguration="serviceMetadata">
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost"/>
        <add baseAddress="net.tcp://localhost"/>
      </baseAddresses>
    </host>
    <endpoint address="BookService"
              binding="netTcpBinding"
              contract="FileServer.IBookService">
    </endpoint>
    <endpoint address="BookService/mex"
              binding="mexTcpBinding"
              contract="IMetadataExchange">
    </endpoint>
    <endpoint address="BookService"
      binding="basicHttpBinding"
      contract="FileServer.IBookService">
    </endpoint>
    <endpoint address="BookService/mex"
              binding="mexHttpBinding"
              contract="IMetadataExchange">
    </endpoint>
    <endpoint address="basic"
              binding ="basicHttpBinding"
              contract="FileServer.ITest">
    </endpoint>
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior name="serviceMetadata">
      <serviceMetadata httpGetEnabled="True"/>
      <serviceDebug includeExceptionDetailInFaults="True"/>
    </behavior>
  </serviceBehaviors>
</behaviors>
</system.serviceModel>

1 Ответ

1 голос
/ 26 мая 2011

Приложение WcfTestClient будет загружать информацию метаданных из службы , а сама служба имеет три конечные точки - поэтому клиент показывает три конечные точки, а недве услуги.Даже если вы предоставляете метаданные через два разных места, они не связаны с конечной точкой или базовым адресом, а с самим хостом службы.

Если вы хотите, чтобы клиент получал метаданные с адреса HTTPчтобы получить только конечную точку HTTP (и то же самое для TCP), вы можете использовать два хоста, как в примере ниже.

public class Post_09851985_ee54_4627_9af7_6a9505c2067f
  {
    [DataContract]
    public class Person
    {
      [DataMember]
      public string name;
      [DataMember]
      public string address;
    }
    [ServiceContract]
    public interface ITest
    {
      [OperationContract]
      Person Echo(Person person);
    }
    [ServiceBehavior(IncludeExceptionDetailInFaults = true)]
    public class Service : ITest
    {
      public Person Echo(Person person)
      {
        return person;
      }
    }
    public static void SingleHost()
    {
      string baseAddressHttp = "http://" + Environment.MachineName + ":8000/Service";
      string baseAddressTcp = "net.tcp://" + Environment.MachineName + ":8008/Service";
      ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddressHttp), new Uri(baseAddressTcp));
      host.AddServiceEndpoint(typeof(ITest), new BasicHttpBinding(), "basic");
      host.AddServiceEndpoint(typeof(ITest), new NetTcpBinding(SecurityMode.None), "tcp");

      host.Description.Behaviors.Add(new ServiceMetadataBehavior());
      host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding(), "mex");
      host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexTcpBinding(), "mex");

      host.Open();
      Console.WriteLine("Host opened");

      Console.WriteLine("Press ENTER to close");
      Console.ReadLine();

      host.Close();
    }
    public static void TwoHosts()
    {
      string baseAddressHttp = "http://" + Environment.MachineName + ":8000/Service";
      string baseAddressTcp = "net.tcp://" + Environment.MachineName + ":8008/Service";
      ServiceHost httpHost = new ServiceHost(typeof(Service), new Uri(baseAddressHttp));
      ServiceHost tcpHost = new ServiceHost(typeof(Service), new Uri(baseAddressTcp));
      httpHost.AddServiceEndpoint(typeof(ITest), new BasicHttpBinding(), "basic");
      tcpHost.AddServiceEndpoint(typeof(ITest), new NetTcpBinding(SecurityMode.None), "tcp");

      httpHost.Description.Behaviors.Add(new ServiceMetadataBehavior());
      tcpHost.Description.Behaviors.Add(new ServiceMetadataBehavior());
      httpHost.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding(), "mex");
      tcpHost.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexTcpBinding(), "mex");

      httpHost.Open();
      tcpHost.Open();
      Console.WriteLine("Host opened");

      Console.WriteLine("Press ENTER to close");
      Console.ReadLine();

      httpHost.Close();
      tcpHost.Close();
    }
    public static void Test()
    {
      TwoHosts();
    }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...