2010-08-25 94 views
7

我有一個net.tcp WCF服務,我希望操作系統選擇它應該監聽的端口。所以我在我的URI中將端口設置爲0,並且netstat確認操作系統選擇了5000範圍內的端口。如何獲取WCF服務正在偵聽的端口?

如何在服務流程中找到在代碼中選取的實際端口?

一些代碼來說明我曾嘗試:

如果
Type serviceType = ...; 
Uri address = new Uri("net.tcp://0.0.0.0:0/Service/"); 
ServiceHost serviceHost = new ServiceHost(serviceType, address); 
ServiceEndpoint endPoint = serviceHost.AddServiceEndpoint(type, binding, ""); 
int port1 = endPoint.ListenUri.Port; // returns 0 
int port2 = serviceHost.BaseAddresses.First().Port; // also returns 0 
+0

得到一個服務在一個隨機端口上收聽是非常不尋常的 - 是否有你想要這樣做的原因? – Cocowalla 2010-08-25 06:45:45

+0

@Cocowalla:該服務是工作進程的一部分,因此可能有多個服務進程,並且我們正在研究不涉及.NET TCP端口共享的解決方案。 – ngoozeff 2010-08-25 06:51:20

+0

[我如何獲得WCF服務的監聽地址/端口?](http://stackoverflow.com/questions/2207348/how-can-i-get-the-listening-address-port-of -a-wcf-service) – mafu 2012-04-18 11:08:20

回答

10

不知道這會有所幫助,但有一個類似的問題已經在SO: How can I get the listening address/port of a WCF service?

一個提交的答案的有關部分規定你可能想嘗試:

foreach (var channelDispatcher in serviceHost.ChannelDispatchers) 
{ 
      Console.WriteLine(channelDispatcher.Listener.Uri); 
} 

所以,也許你需要channelDispatcher.Listener.Uri.Port

希望這會有所幫助!

+1

@D Hoerster:不幸的是,它只是返回我傳入的URI。謝謝指向另一個問題的指針。 – ngoozeff 2010-08-25 07:22:10

+3

@D Hoerster:看起來我們有一個贏家。我也必須設置endPoint.ListenUriMode = ListenUriMode.Unique;爲此工作(並禁用綁定上的端口共享)。 – ngoozeff 2010-08-27 06:15:54

+0

你打電話給Open嗎? – BozoJoe 2012-05-11 20:38:37

1

作爲替代方案,你可以找到一個免費的端口WCF使用自己:從here

private int FindPort() 
{ 
    IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 0); 

    using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) 
    { 
     socket.Bind(endPoint); 
     IPEndPoint local = (IPEndPoint)socket.LocalEndPoint; 
     return local.Port; 
    } 
} 

代碼。

+1

這不安全。其他人可以在處理套接字後但在ServiceHost打開之前搶奪端口。所以這種方法可能偶爾會失敗。 – BatteryBackupUnit 2014-07-21 12:09:31

3

服務啓動後,您可以完全描述實際上從Description.Endpoints集合創建的端點(直到調用Open()後才能使用)。從這個集合中你可以得到地址。不幸的是,你不得不爲字符串解析端口的地址。

這是我的服務器在每個服務打開()後記錄的內容。

 serviceHost.Open(); 

     // Iterate through the endpoints contained in the ServiceDescription 
     System.Text.StringBuilder sb = new System.Text.StringBuilder(string.Format("Active Service Endpoints:{0}", Environment.NewLine), 128); 
     foreach (ServiceEndpoint se in serviceHost.Description.Endpoints) 
     { 
      sb.Append(String.Format("Endpoint:{0}", Environment.NewLine)); 
      sb.Append(String.Format("\tAddress: {0}{1}", se.Address, Environment.NewLine)); 
      sb.Append(String.Format("\tBinding: {0}{1}", se.Binding, Environment.NewLine)); 
      sb.Append(String.Format("\tContract: {0}{1}", se.Contract.Name, Environment.NewLine)); 
      foreach (IEndpointBehavior behavior in se.Behaviors) 
      { 
       sb.Append(String.Format("Behavior: {0}{1}", behavior, Environment.NewLine)); 
      } 
     } 

     Console.WriteLine(sb.ToString()); 
+0

+1讓我走上正軌 – ngoozeff 2010-08-27 06:16:34

相關問題