コンテキスト:私は(これらのアプリケーションは、C#である)私たちのアプリケーションのいくつかを監視する監視サーバを開発する必要がありWCF:サーバーからサービスインスタンスへのアクセス
。そこで、私のニーズに合った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
}
}
Consoleサーバーのコンソールアプリケーション例
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();
}
}
}
おかげで私はすでに自分のコードに同様のことを行います。 –