服務作爲根據ServiceBehaviourAttribute
屬性InstanceContextMode
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class MyService : IMyService
{
// ...
的值被實例化的對象運行用於InstanceContextMode是
Single
- 服務的單個實例時,所有會話中運行時和調用
PerSession
- 爲每個會話運行的服務實例(即每個客戶端)
PerCall
- 服務的一個實例的實例每次調用,即使從單一的客戶端
默認值是PerSession
,這使得大多數場景感。假設您使用的是PerSession
,那麼您可以在服務的構造函數中放入任何「連接邏輯」。
// you don't need to specify PerSession as it is default, but I have for clarity
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class MyService : IMyService
{
public MyService()
{
// constructor will be called for each new client session
// eg fire an Event, log a new client has connected, etc
}
// ...
}
你需要在構造函數中謹慎運行的代碼,因爲直到構造已完成的服務將無法使用。如果您想做任何可能需要時間的事情,請發起一個活動或發送一個線索來執行這項工作。
我不確定我是否完全理解你在說什麼,但在我看來,像構造函數中的邏輯不會真的讓主機知道一個新的連接。當新服務器啓動時,它只會在WCF服務中執行邏輯。 – Brian
哪部分你不明白?每個新連接都會啓動一個新的服務實例,因此每個新連接都會調用服務構造函數。 –
是的,我明白,但是HOST(在我的情況下是windows服務)怎麼知道連接?構造函數在WCF服務中。 – Brian