WCF コールバックを使用して、会社の LAN 内にアラート タイプのシステムを実装しています。サブスクライブ メカニズムなどがあります。このチュートリアルを出発点として使用しましたが、バインドを wsDualHttpBinding ではなく NetTcpBinding に変更し、Windows サービスで自己ホストしています。
それは非常にうまく機能していますが、質問があります。私のクライアントのほとんどは、コールバックを必要としません。それらは、コールバックが有効な「通知」アプリケーションを実行し、そのタイプのアラートにサブスクライブしているクライアントに渡される一方向のアラートをサーバーに送信するだけでよいさまざまなデスクトップ アプリケーションです。
ここでは何も気にしないかもしれませんが、私の WCF サービスはコールバックを実装しているため、コールバックが必要かどうかにかかわらず、すべてのクライアントはコールバック オブジェクトを実装する必要があります。一方向のクライアントがコールバックを行わないサービスと通信する場合、より整然としたソリューションのように思えます。
だから... WCF サービスでコールバックなしで別のエンドポイントを作成しました。シンプルな一方向のメソッド呼び出しだけです。それは機能しますが、私の問題は、受信したメッセージをコールバック対応サービスに渡す方法がよくわからないことです。
私のWindowsサービスには次のようなものがあります:
internal static ServiceHost myNotifyHost;
internal static ServiceHost mySendingHost;
protected override void OnStart(string[] args)
{
// service with callback
myNotifyHost = new ServiceHost(typeof(NotifyService));
myNotifyHost.Open();
// service without callback
mySendingHost = new ServiceHost(typeof(SendingService));
mySendingHost.Open();
}
sendonly クライアントによって呼び出される SendingService メソッドでは、これを実行できると思いました。
var notify = (NotifyService)WindowsService.myNotifyHost.SingletonInstance;
notify.SendMessage("Message text");
SendMessage() は、サブスクライブしたクライアントにコールバック メッセージを送信します。残念ながら、myNotifyHost.SingletonInstance は、クライアントが接続されてコールバックを待っている場合でも常に null です。そのプロパティの意味を誤解していると思います。NortifyService には次の属性があります
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
2 つのサービス間で通信する方法はありますか? 私はこれをあきらめて、1 つのサービスに固執し、それを必要としないクライアントに意味のないコールバック クラスを実装することで生きていかなければなりません。この時点では大したことではありません。それは、私の WCF の理解に関係しています。
ありがとう