2010-03-26 81 views
2

閱讀WCF我們有自己的託管選項,我們必須自己管理主機進程生命週期。我在這裏探索的是在沒有IIS的情況下運行該服務並進行自我託管。如何在沒有iis的情況下自我託管wcf

想到很少的東西 - 請求管理如何在此工作。在IIS的情況下,它管理請求並在特定線程上對dotnet進行控制。在沒有IIS的情況下,我們需要自己編寫代碼來管理傳入的請求(比如在一個tcp端口上),或者WCF提供一些類來管理請求並生成線程來處理每個線程。

  • 我知道,在自我託管的情況下,這需要是一個Windows服務。在自我託管的情況下,我怎樣才能在服務器上同時請求數量,它可以通過限制線程池來管理?或者我們可以通過wcf配置這個?

感謝 DC

回答

6

自託管不要求一個Windows服務。如果您願意,您可以在控制檯應用程序內自行託管。只是如果您需要全天候訪問,但不希望出於任何原因使用IIS,則Windows服務是自託管的一個很好的解決方案。

管理主機進程的生命週期並不是什麼大事。我使用Windows服務來託管WCF服務。我只是在OnStart()回調我的Windows服務的啓動我的WCF服務,像這樣:

private ServiceHost _host; 
protected override void OnStart(string[] args) 
{ 
    _host = new ServiceHost(typeof(CalculatorService)); 
    _host.Open(); 
} 

同樣,我關閉了OnStop()回調我的Windows服務的WCF服務:

protected override void OnStop() 
{ 
    if (_host != null) _host.Close(); 
} 

這有效將WCF服務的生命週期與Windows服務的生命週期綁定在一起。您可以在任何類型的應用程序(控制檯,Windows窗體應用程序等)中執行類似操作。例如,在Windows Forms應用程序的OnLoad()回調中,啓動ServiceHost作爲WCF服務,並在退出應用程序時關閉它。夠簡單。

WCF爲如何處理傳入請求提供了很大的靈活性。例如,您可以使您的WCF服務成爲單例,這意味着您將擁有一個且只有一個WCF服務實例。在這種情況下,所有傳入的請求都由這一個實例處理。但是你也可以讓你的WCF服務用你的WCF服務的一個新實例來處理每個傳入的請求。這可以讓您的服務更好地擴展,但可能需要您同步對後端數據存儲的任何訪問權限,例如數據庫。您可以使用WCF服務上的ServiceBehaviorAttributeInstanceContextMode屬性來控制此行爲。

當我再次閱讀你的問題時,聽起來你只是在學習WCF,所以我希望這些都不會讓你不知所措。查看我對this SO question的回答,查看可能對您有幫助的一些鏈接。

1

爲了回答您的具體問題,WCF託管基礎設施將旋轉了一個HTTP偵聽與HTTP.SYS(同樣的事情IIS使用),將交通監聽的具體工作您配置的端口/地址。

對於任何其他問題,我相信this section in MSDN將回答他們。