2011-08-30 47 views
5

我想在我的WCF服務啓動後做一些事情。怎麼辦?當我的WCF服務啓動時做一些事情

實際上,我應該每10分鐘更新一次服務的變量。所以我把我的更新代碼放在一個線程中。但是我不知道在服務啓動時如何啓動這個線程(在WCF服務中是否有任何事情喜歡Form_Load事件?)

+1

你如何主辦你的wcf服務? – Jan

回答

2

很難讓線程在服務器上運行。一旦最後一個會話結束,應用程序關閉。一些託管服務提供商還會按計劃回收應用程序池,這會使線程無法運行。

除此之外,WCF服務並不實際運行。它們的行爲與請求觸發的網頁類似。添加init代碼的明智之處在於Application_StartGlobal.asax。這會在應用程序啓動時(第一個請求被調用)調用一次。

如果您希望對您的服務的每個請求執行一些操作,則可以在Global.asax中掛接Application_BeginRequest事件。

+0

'Global.asax'? ;) – Marc

+0

@Marc:P-固定 – TheCodeKing

+0

如果他在Windows服務或自託管應用程序中託管WCF會怎麼樣?在那裏沒有global.asax,它在這個意義上並不作爲一個web應用程序。另外WCF可能根本不使用會話。 – oleksii

5

您的WCF服務中通常沒有任何部分「僅僅是在」內存中「準備好做某事」.... WCF是不是 ASP.NET!

在IIS託管時,默認的設置是這樣的:

  • IIS上監聽請求的特定端口/ URL - 有WCF服務的一個跟蹤在存儲器中的任何不

  • 當第一個請求進來時,IIS將啓動一個ServiceHost - 一個可以「託管」服務的類

  • 此服務主機然後將查看請求已進入並根據目標URL決定它將決定e要實例化哪個服務類來處理此請求。服務類(服務實現),然後創建並在該服務類中的適當方法被調用和執行,一旦這項步驟完成後,服務類配置

所以基本上,有兩點,你可以掛接到:

  1. 你可以創建自己的自定義ServiceHost類時,它被實例化

  2. 你可以添加一些「初始化」代碼添加到每個服務類的方法具,會做什麼DS處理您的需求

+1

其他類型的託管呢?這是IIS特定的。例如,在Win服務託管中,OP可以創建一個計時器並使用tick事件來執行此操作。 – oleksii

+0

@oleksii:當你自己託管,是的,你有更多的控制 - 但仍然 - 你基本上可以調整在你的控制下實例化的服務主機,或者你在服務方法中做一些事情,當它被稱爲 –

+0

什麼如果有人想要在內存中「懸掛」一些東西,那麼他們是否應該這樣做? – AjaxLeung

0

您可以創建一個實例化的服務,這將取決於您的服務開始調用構造函數:

[ServiceContract] 
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 
public class InstanceService 
{ 
    private int _intValue; 

    public InstanceService() 
    { 
     _intValue = 456; 
    } 

    [OperationContract] 
    public int GetData() 
    { 
     return _intValue; 
    } 
} 

這個服務調用的GetData()將返回一個整數值爲456.

+3

這樣的一個單例服務實例有兩個主要缺點:1)它要麼連續化請求,要麼一個接一個地處理,造成潛在的巨大瓶頸 - 或者2)它需要完全支持多線程的編程,這是不容易的,容易出錯。我會盡量避免單身人士 –

+0

你說得對,我忘了提及這隻會在非常具體的情況下有用,而且不應該被輕易考慮。 – CodeCaster

0

如果您能夠控制如何承載此功能,則可以實現此功能。如果可以,請將您的WCF服務作爲Windows服務或臨時可執行文件託管。然後你可以輕鬆地達到你想要的。如果你受限於IIS託管,你必須按照別人的建議去做,並按照請求處理它。

如果不需要IIS,請閱讀自承載wcf。

相關問題