如何确定哪个Windows Communication Foundation服务正在使用给定端口?

时间:2013-02-26 02:56:12

标签: c# windows wcf tcplistener netstat

理想情况下,我想在C#中执行此操作,因此我将包含C#标记。

我有几个使用System.ServiceModel.ServiceHost运行并打开TCP端口(每个一个)的Window Communication Foundation服务。我有一个正在使用的端口号列表,但我想使用正在运行的服务从端口号映射到可执行文件。

我曾尝试使用netstat,TCPView和其他一些类似的工具,我发现尝试搜索此解决方案,但没有任何显示我的过程,我能得到的最接近的是系统(PID 4)。

所有这些都是Windows WCF服务,按预期运行,并且显示在netstat和TCPView(按端口号),但只能提供“系统”作为进程。

代码由几个不同的部门管理,因此我不会将通用接口方法视为有效的解决方案。我对该机器拥有完全的管理员权限。

2 个答案:

答案 0 :(得分:1)

WCF提供了一个WMI interface for diagnostics,您可以使用它来将WCF服务端口与特定进程相关联。特别是Service课看起来很有希望。

(请随意在此处附上您的示例代码,或将其作为另一个答案发布。)

答案 1 :(得分:1)

将我的示例代码添加到@ HarryJohnston的答案:

String wcfNamespace = String.Format(@"\\{0}\Root\ServiceModel", "MachineName");

ConnectionOptions connection = new ConnectionOptions();
connection.Authentication = AuthenticationLevel.PacketPrivacy;
ManagementScope scope = new ManagementScope(wcfNamespace, connection);
scope.Connect();

ObjectQuery query = new ObjectQuery("Select * From Service");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);

ManagementObjectCollection queryCollection = searcher.Get();
ManagementObject[] listing = queryCollection.OfType<ManagementObject>().ToArray();

Dictionary<int, int> portToPID = new Dictionary<int, int>();

foreach (ManagementObject mo in queryCollection)
{
    //each of services only have one base address in my example
    Uri baseAddress = new Uri(((Array)mo.Properties["BaseAddresses"].Value).GetValue(0).ToString());
    int pid = Int32.Parse(mo.Properties["ProcessId"].Value.ToString());
    portToPID.Add(baseAddress.Port, pid);
}

还需要将此添加到每个服务.config,而不是WMI客户端

<system.serviceModel>
    …
    <diagnostics wmiProviderEnabled="true" />
    …
</system.serviceModel>