2012-03-27 33 views
1

我需要在防火牆中添加一條規則,以便自我託管的http Web服務可以接收請求,但是無論何時添加指定執行託管的程序或服務的規則,客戶端請求都會被阻止。爲什麼WCF服務監聽爲PID 4(SYSTEM)而不是作爲託管它的進程的PID?

Netstat顯示在該端口偵聽的PID是4(系統)。我不想打開整個端口來打電話給SYSTEM,我想限制打電話給正在執行託管的特定程序/服務。任何人都可以提供一些關於我如何完成此任務的見解?

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

這裏是一個準系統例如(實際託管庫是asp.net mvc4網頁API,但我發現,它也與原來的WCF的Web API和只是普通的WCF服務真)。我試圖在自己的線程上打開服務主機,但沒有任何影響。奇怪的是,當我寫的PID到控制檯它是節目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); 
    } 
} 

回答

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

+0

它不是用戶,它運行在那是問題。問題在於它正在傾聽的過程。在這種情況下,SYSTEM是一個PID爲4的進程。我需要它來監聽正在進行實際託管的進程,以便鎖定對特定程序的請求。我已經看到服務使用他們自己的程序PID進行監聽,所以我知道這是可能的,但我不確定在何處或在什麼級別配置。 – Despertar 2012-03-27 19:23:06

+1

使用HTTP/HTTPS,所有監聽通常由系統級sttp.sys完成。請參閱http://stackoverflow.com/questions/1473248/does-all-http-trafic-go-through-http-sys-on-windows – Maurice 2012-03-27 19:39:05

+0

感謝您的鏈接,這很有幫助。如果我使用net.tcp:// localhost:1234這樣的地址,那麼PID就是宿主程序的PID,但正如鏈接所說,http必須作爲系統運行,除非你編寫自己的http處理程序,因爲安全原因。 – Despertar 2012-03-28 23:25:12

1

隨着網絡插口,只有一個進程/線程可以聽一個給定的端口,因此是HTTP.sys攔截所有請求,並轉發允許多個網站收聽同一端口80上他們根據URI/binding綁定到適當的進程。

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站點或Web 應用程序的用戶模式進程的請求 隊列。 HTTP.sys也將響應發送回客戶端。

相關問題