我需要開發一些監控我們的應用程序的監控服務器(這些應用程序在C#)。所以我決定用WCF開發這個系統,這看起來適合我的需要。
這些應用程序在啓動時必須註冊到監視服務器。之後,監控服務器可以調用這些應用程序的啓動或停止方法。
一切都完全在同一臺機器上執行,沒有什麼需要遠程執行。
所以我開發了一個很好的原型,一切正常。每個應用程序都將自己註冊到監控服務器
問:
ApplicationRegistrationService
(見下面的代碼)是監控服務的實現,它是一個單獨的實例由於ServiceBehavior
屬性。
這裏我的問題:我想訪問每個例子的ApplicationRegistrationService
的內容,從我的服務器連接的應用程序的數量(例如ConsoleMonitoringServer
)。但是,我不知道如何實現這一點。
是否需要在我的服務器中創建一個像我在客戶端(ConsoleClient
)那樣的服務的通道,或者存在更好的方法來實現此目的?
代碼:
該代碼是非常簡化爲這個問題的目的:
//The callback contract interface
public interface IApplicationAction
{
[OperationContract(IsOneWay = true)]
void Stop();
[OperationContract(IsOneWay = true)]
void Start();
}
[ServiceContract(SessionMode = SessionMode.Required,
CallbackContract = typeof(IApplicationAction))]
public interface IApplicationRegistration
{
[OperationContract]
void Register(Guid guid, string name);
[OperationContract]
void Unregister(Guid guid);
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,
ConcurrencyMode = ConcurrencyMode.Multiple)]
public class ApplicationRegistrationService : IApplicationRegistration
{
//IApplicationRegistration Implementation
}
public class ApplicationAction : IApplicationAction
{
//IApplicationAction Implementation
}
對於這個例子
class ConsoleClient
{
static void Main(string[] args)
{
ApplicationAction actions = new ApplicationAction();
DuplexChannelFactory<IApplicationRegistration> appRegPipeFactory =
new DuplexChannelFactory<IApplicationRegistration>(actions,
new NetNamedPipeBinding(), new EndpointAddress("net.pipe://localhost/AppReg"));
IApplicationRegistration proxy = appRegPipeFactory.CreateChannel();
proxy.Register(Guid.Empty, "ThisClientName");
//Do stuffs
}
}
控制檯服務器該控制檯應用程序示例
class ConsoleMonitoringServer
{
static void Main(string[] args)
{
using (ServiceHost host = new ServiceHost(typeof(ApplicationRegistrationService),
new Uri[]{ new Uri("net.pipe://localhost")}))
{
host.AddServiceEndpoint(typeof(IApplicationRegistration),
new NetNamedPipeBinding(), "AppReg");
host.Open();
//Wait until some write something in the console
Console.ReadLine();
host.Close();
}
}
}
感謝您的鏈接,但我已經在我的代碼做類似的事情。 – 2009-07-08 03:07:53