2011-09-22 124 views
2

我有一個由Windows服務託管的WCF服務。我無法弄清楚當客戶端連接到WCF服務時如何通知windows服務。基本上所有我在窗口服務啓動WCF服務是這樣的:如何在客戶端連接時通知主機WCF服務?

private ServiceHost sHost; 
WCF.WCFService wcfService = new WCF.WCFService(); 
sHost = new ServiceHost(wcfService); 
sHost.Open(); 

我能夠調用與使用wcfService對象Windows服務WCF服務的方法。有什麼方法可以讓客戶端連接到WCF服務時觸發某種事件?

回答

1

服務作爲根據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 
    } 
    // ... 
} 

你需要在構造函數中謹慎運行的代碼,因爲直到構造已完成的服務將無法使用。如果您想做任何可能需要時間的事情,請發起一個活動或發送一個線索來執行這項工作。

+0

我不確定我是否完全理解你在說什麼,但在我看來,像構造函數中的邏輯不會真的讓主機知道一個新的連接。當新服務器啓動時,它只會在WCF服務中執行邏輯。 – Brian

+0

哪部分你不明白?每個新連接都會啓動一個新的服務實例,因此每個新連接都會調用服務構造函數。 –

+0

是的,我明白,但是HOST(在我的情況下是windows服務)怎麼知道連接?構造函數在WCF服務中。 – Brian

相關問題