2011-10-16 38 views
2

有點背景信息 - 我想在Azure上託管一個RESTful WCF服務。據我所知,除非我的ASP.NET類型託管的角色,我並不真的需要global.asax類(其中有application_start方法)。在IIS上託管的WCF服務的入口方法是什麼?

從基本原型開始,我所需要的就是svc文件及其背後的實現,它會在角色啓動時自動初始化(我的意思是,託管在IIS上)。這非常棒,因爲除了web之外,我不需要額外的代碼.config和我的服務已啓動並正在運行。我不需要創建新的服務主機並開始監聽,等等。我可以將角色和POST消息部署到我的服務中。

問題 - 我有自定義日誌記錄和初始化類實現,我需要初始化時,我的服務啓動。我配置我的服務是一個單身人士,我不知道我應該把我的自定義初始化組件。

沒有明確的應用程序啓動方法和我的服務配置爲單例,我可以假設當第一個請求進來時,我的服務構造函數被調用? (以及我所有的自定義初始化?)。

回答

2

我可以假設當第一個請求進來時,我的服務構造函數被調用?

是的,但你應該問自己,你是否真的希望你的服務以單身身份運行。如果你對此感到滿意,那麼它會正常工作。如果你不希望它作爲一個單身人士運行,那麼你應該使用自定義工廠來查看Russell的答案。

查看Should WCF service typically be singleton or not?瞭解有關WCF服務是否應該是單身人士的一些討論。您需要決定您的情況,但一般 WCF服務不是單身人士,除非他們需要。

要實現自定義工廠,請參閱此MSDN鏈接Extending Hosting Using ServiceHostFactory。爲紐帶描述,延伸服務主機工廠,像這樣

然後在ServiceHost的指令

<% @ ServiceHost 
    Service="MyNamespace.MyService" 
    Factory="MyNamespace.DerivedFactory" %> 
+0

謝謝柯克。我甚至考慮過把它變成單身人士的唯一原因就是我上面提到的原因.ie。我只想要初始化日誌類的一個實例,即所有請求實例都可以共享...最簡單的方法就是使服務類成爲單例,並重載構造函數來做我想做的事。閱讀更多關於使用單件服務的缺點,我意識到它可能不是最好的主意。儘管我有一個後續問題.. DerivedFactory不會在x.svc.cs中替換我的代碼,是正確的嗎? – kosh

+0

你是對的 - 「DerivedFactory」是一個你必須編寫的新類。如果你想把邏輯放在構造函數中,並且它是有效的,那麼你認爲Singleton模式是確保構造函數被調用一次的簡單方法。只要確保你很高興有一個Singleton! –

+0

太棒了!感謝所有的幫助。 – kosh

2

您正在尋找ServiceHostFactory。您可以將一部分添加到SVC文件以使用工廠,您可以在其中執行任何可能需要的日誌記錄。

我已經在過去使用這個來啓動一個後臺工作者爲一些後臺工作啓動一個單獨的線程。

http://msdn.microsoft.com/en-us/library/system.servicemodel.activation.servicehostfactory.aspx

希望這有助於你得到你需要的人。 :)

+0

感謝羅素,幫助指定的工廠。我確實有一個後續問題。派生工廠不會取代我的服務實施,對嗎?我仍然有代碼,坐在x.svc.cs中,Derived工廠只讓我在當前進程中啓動一個線程/作業? – kosh

+0

正確,工廠用於幫助主機啓動過程。服務主機仍然會啓動.svc文件中的服務合約設置等。 – Russell