私が取り組んでいるプロジェクトは、すべてのサービスが WCF で記述され、クライアントが WPF で記述されたクライアント サーバー アプリケーションです。サーバーが情報をクライアントにプッシュする必要がある場合があります。最初は WCF Duplex Services の使用について考えていましたが、オンラインで調査した結果、多くの人がさまざまな理由で使用を避けていることがわかりました。
次に考えたのは、クライアントにホスト接続を作成させて、サーバーがそれを使用してクライアントへのサービス呼び出しを行えるようにすることでした。ただし、問題は、アプリケーションがインターネット経由で展開されることです。そのため、このアプローチでは、着信トラフィックを許可するようにファイアウォールを構成する必要があり、ほとんどのユーザーは通常のユーザーであるため、ポート転送を許可するようにルーターを構成することも必要になる場合があります。ユーザーにとっては面倒。
GetNotifications()
私の 3 番目のオプションは、クライアントで、サーバー上のメソッドを呼び出すバックグラウンド スレッドを生成することです。サーバー側のこのメソッドは、実際の通知が作成されるまでブロックし、スレッドに通知され (AutoResetEvent
おそらくオブジェクトを使用して?)、情報がクライアントに送信されます。アイデアは次のようなものです。
クライアント
private void InitializeListener()
{
Task.Factory.StartNew(() =>
{
while (true)
{
var notification = server.GetNotifications();
// Display the notification.
}
}, CancellationToken.None, TaskCreationOptions.LongRunning, TaskScheduler.Default);
}
サーバ
public NotificationObject GetNotifications()
{
while (true)
{
notificationEvent.WaitOne();
return someNotificationObject;
}
}
private void NotificationCreated()
{
// Inform the client of this event.
notificationEvent.Set();
}
この場合、NotificationCreated()
は、サーバーがクライアントに情報を送信する必要があるときに呼び出されるコールバック メソッドです。
このアプローチについてどう思いますか?これはスケーラブルですか?