我有这个自托管服务。在app.config中我定义了两个基地址。一个用于http,一个用于net.tcp。
通过两个端点公开一个合同,一个使用basicHttpBinding,另一个使用netTcpBinding。
现在,奇怪的是两个端点都可用于两个baseaddresses。如果我使用wcfclient.exe应用程序连接到任一端点,则两个端点都会显示。即net.tcp上的basicHttpBinding,反之亦然。
为什么这样,我能为此做些什么吗?
参考配置。
<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>
答案 0 :(得分:1)
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();
}
}