9

さまざまなプラットフォームのさまざまなアプリケーションと通信する必要がある ASP.NET Web API サーバーがあります。次に、コールバックのようなメソッドを作成したいと思います。クライアント アプリケーションはそれにサブスクライブし、サーバーがメッセージを送信するまで待機します。

例: 多くのユーザーは新製品が店頭に並ぶまで待っています。彼らはこの「イベント」に登録しています。商品が店舗に到着すると、すべての顧客がメッセージを受け取りますが、場合によってはそれを処理する必要があります。

  1. ユーザーは「購読」リクエストを送信します
  2. サーバーは「製品が利用可能です!」というリクエストを受け取ります。
  3. サーバーは、製品の詳細を含むメッセージをすべてのユーザーに送信します。
  4. ユーザーのアプリケーションがメッセージを処理する

ASP.NET Web API のコールバックまたはデュプレックスに関する情報を見つけようとしましたが、1 つのアドバイスとして、このアプローチには WCF を使用することをお勧めします。

ソリューション

  • すべてのクライアント アプリケーションで、N 秒ごとに「製品は入手可能ですか?」という要求を送信するタイマーのようなものを作成します。「false」になるまで。応答が true の場合 - 「Get product details」というメッセージを送信します。これは大量のトラフィックを引き起こします。これらのタイマーを使用するクライアントが多数存在する場合、何か悪いことになるのではないでしょうか?
  • 小さなコールバック サーバー (おそらく WCF) を作成します。ただし、この場合、このサーバーと異なるプラットフォーム上のアプリとの間の通信に多くの問題が発生します。
  • ASP.NET Web API には、私が見逃した解決策があるかもしれません。

この問題を解決する方法があれば、アドバイスをお願いします。

手伝ってくれてありがとう。

4

1 に答える 1

11

サーバーからのプッシュ通知が必要なようです。この場合、SignalR と Web API を組み合わせることで実現できます。

ブラッド・ウィルソンはこれについて素晴らしい例を持っています:

  1. ここのコード - https://github.com/bradwilson/WebstackOfLove

  2. このすべてを説明するNDCオスロトーク - http://vimeo.com/43603472

つまり、Web API に新しいアイテムを追加するたびに、接続されている (サブスクライブしている) すべてのクライアントに通知できます。

public void PostNewItem(ToDoItem item)
        {
            lock (db)
            {
                // Add item to the database
                db.Add(item);

                // Notify the connected clients
                Hub.Clients.processItem(item);
            }
        }

SignalR はprocessItem、クライアントで関数を呼び出します。

または、JavaScript SSE と Web API を調べることもできますPushStreamContentが、それははるかに低レベルであり、SignalR はこの種のものの多くを抽象化するため、処理がより複雑になる可能性があります。

ここでこのアプローチについてブログを書きましたhttp://www.strathweb.com/2012/05/native-html5-push-notifications-with-asp-net-web-api-and-knockout-js/

于 2013-01-06T17:37:57.200 に答える