2011-03-14 71 views
0

我有這種自我託管的服務。在app.config中我定義了兩個基地址。一個用於http,一個用於net.tcp。無論使用何種綁定,WCF都會暴露在所有基地址上的WCF相對端點地址

一個合約通過兩個端點公開,一個是basicHttpBinding,另一個是netTcpBinding。

現在,奇怪的是,兩個端點都可以在兩個baseaddresses。如果我使用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> 

回答

0

的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(); 
    } 
    }