【问题标题】:Why is WCF service listening as PID 4 (SYSTEM) and not as the PID of the process hosting it?为什么 WCF 服务侦听为 PID 4 (SYSTEM) 而不是托管它的进程的 PID?
【发布时间】:2012-03-27 06:09:29
【问题描述】:

我需要在防火墙中添加一条规则,以便我的自托管 http Web 服务可以接收请求,但是每当我添加一条指定正在执行托管的程序或服务的规则时,客户端请求都会被阻止。

Netstat 显示侦听该端口的 PID 为 4 (SYSTEM)。我不想为对 SYSTEM 的任何调用打开整个端口,我想限制对执行托管的特定程序/服务的调用。谁能提供一些关于我如何实现这一点的见解?

netstat -ano
TCP    0.0.0.0:1234        0.0.0.0:0              LISTENING       4
TCP    [::]:1234              [::]:0              LISTENING       4

这是一个准系统示例(实际托管库是 asp.net mvc4 web api,但我发现原始 wcf web api 和常规 wcf 服务也是如此)。我尝试在自己的线程上打开服务主机,但这没有影响。奇怪的是,当我将 PID 写入控制台时,它是 programs PID,但 netstat 仍然报告它正在侦听 PID 4。

class Host
{
    private static HelloWorldService service;

    static void Main()
    {
        Thread HostingThread = new Thread(OpenHostingThread);
        HostingThread.Start();

        Console.WriteLine("Server Running...");
        Console.ReadLine();
    }

    static void OpenHostingThread()
    {
        service = new HelloWorldService();
        HttpServiceHost host = new HttpServiceHost(service, "http://localhost:1234");
        host.Open();
        Console.WriteLine(Process.GetCurrentProcess().Id);
    }
}

【问题讨论】:

    标签: c# asp.net wcf http asp.net-web-api


    【解决方案1】:

    Web API 使用 HTTP 而不是 TCP 作为其传输。默认情况下,仅允许管理员开始侦听 HTTP 端点。如果您希望其他用户这样做,您需要在 Windows 7/2008 上使用 netsh 或在 Windows XP/2003 上使用 httpcfg。

    netsh http add urlacl url=http://+:80/MyUri user=DOMAIN\user
    

    Configuring HTTP and HTTPS

    【讨论】:

    • 问题不在于运行它的用户。问题在于它正在侦听的过程。在这种情况下,SYSTEM 是一个 PID 为 4 的进程。我需要它作为正在执行实际托管的进程进行侦听,以便我可以锁定对该特定程序的请求。我已经看到服务使用他们自己的程序 PID 进行侦听,所以我知道这是可能的,但不确定这是在哪里或在什么级别配置的。
    • 使用 HTTP/HTTPS,所有监听通常由系统级 sttp.sys 完成。见stackoverflow.com/questions/1473248/…
    • 感谢您提供的链接,这很有帮助。如果我使用诸如 net.tcp://localhost:1234 之类的地址,则 PID 是托管程序的 PID,但正如链接所述,除非您编写自己的 http 处理程序,否则 http 必须作为系统运行,这是不鼓励的安全原因。
    • 是的,对于 HTTP,所有列表都是由名为 http.sys 的系统级进程完成的。在这种情况下,您的应用程序需要获得向 http.sys 注册的权限,这可以使用 netsh 命令完成。
    【解决方案2】:

    使用网络套接字,只有单个进程/线程可以监听给定端口,因此 HTTP.sys 通过拦截所有请求并根据 URI/ 将它们转发到适当的进程,使多个网站可以监听同一个端口 80/绑定。

    How can a WCF service listen the same port as IIS?

    WCF without HTTP.SYS

    HTTP.sys Article

    当您创建网站时,IIS 使用 HTTP.sys 注册该网站, 然后接收对该站点的任何 HTTP 请求。 HTTP.sys 函数 像转发器一样,将它收到的 Web 请求发送到请求中 运行网站或 Web 的用户模式进程的队列 应用。 HTTP.sys 还将响应发送回客户端。

    【讨论】:

      猜你喜欢
      • 2020-12-12
      • 2018-07-02
      • 1970-01-01
      • 2010-11-28
      相关资源
      最近更新 更多