我想在我的WCF服務啓動後做一些事情。怎麼辦?當我的WCF服務啓動時做一些事情
實際上,我應該每10分鐘更新一次服務的變量。所以我把我的更新代碼放在一個線程中。但是我不知道在服務啓動時如何啓動這個線程(在WCF服務中是否有任何事情喜歡Form_Load事件?)
我想在我的WCF服務啓動後做一些事情。怎麼辦?當我的WCF服務啓動時做一些事情
實際上,我應該每10分鐘更新一次服務的變量。所以我把我的更新代碼放在一個線程中。但是我不知道在服務啓動時如何啓動這個線程(在WCF服務中是否有任何事情喜歡Form_Load事件?)
很難讓線程在服務器上運行。一旦最後一個會話結束,應用程序關閉。一些託管服務提供商還會按計劃回收應用程序池,這會使線程無法運行。
除此之外,WCF服務並不實際運行。它們的行爲與請求觸發的網頁類似。添加init代碼的明智之處在於Application_Start
的Global.asax
。這會在應用程序啓動時(第一個請求被調用)調用一次。
如果您希望對您的服務的每個請求執行一些操作,則可以在Global.asax
中掛接Application_BeginRequest
事件。
'Global.asax'? ;) – Marc
@Marc:P-固定 – TheCodeKing
如果他在Windows服務或自託管應用程序中託管WCF會怎麼樣?在那裏沒有global.asax,它在這個意義上並不作爲一個web應用程序。另外WCF可能根本不使用會話。 – oleksii
您的WCF服務中通常沒有任何部分「僅僅是在」內存中「準備好做某事」.... WCF是不是 ASP.NET!
在IIS託管時,默認的設置是這樣的:
IIS上監聽請求的特定端口/ URL - 有WCF服務的一個跟蹤在存儲器中的任何不
當第一個請求進來時,IIS將啓動一個ServiceHost
- 一個可以「託管」服務的類
此服務主機然後將查看請求已進入並根據目標URL決定它將決定e要實例化哪個服務類來處理此請求。服務類(服務實現),然後創建並在該服務類中的適當方法被調用和執行,一旦這項步驟完成後,服務類配置
所以基本上,有兩點,你可以掛接到:
你可以創建自己的自定義ServiceHost
類時,它被實例化
你可以添加一些「初始化」代碼添加到每個服務類的方法具,會做什麼DS處理您的需求
您可以創建一個實例化的服務,這將取決於您的服務開始調用構造函數:
[ServiceContract]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class InstanceService
{
private int _intValue;
public InstanceService()
{
_intValue = 456;
}
[OperationContract]
public int GetData()
{
return _intValue;
}
}
這個服務調用的GetData()將返回一個整數值爲456.
這樣的一個單例服務實例有兩個主要缺點:1)它要麼連續化請求,要麼一個接一個地處理,造成潛在的巨大瓶頸 - 或者2)它需要完全支持多線程的編程,這是不容易的,容易出錯。我會盡量避免單身人士 –
你說得對,我忘了提及這隻會在非常具體的情況下有用,而且不應該被輕易考慮。 – CodeCaster
如果您能夠控制如何承載此功能,則可以實現此功能。如果可以,請將您的WCF服務作爲Windows服務或臨時可執行文件託管。然後你可以輕鬆地達到你想要的。如果你受限於IIS託管,你必須按照別人的建議去做,並按照請求處理它。
如果不需要IIS,請閱讀自承載wcf。
你如何主辦你的wcf服務? – Jan