2016-07-30 4 views
4

私はアプリケーションを開発しました。サーバー側の技術はasp.netのWeb APIであり、クライアント側はjavascriptです。私のアプリケーションでは、Signalrを使用してクライアントに通知を送ります - サーバーからクライアントへの通知をプッシュします。シグナルインテグレータとWeb APIを統合してクライアントに通知を送る

すべてのsignalrのやりとりは、HTTPリクエストからのプッシュと、クライアントからsignalrを通してサーバーへのプッシュではないため、Hubクラスの外部で発生します。

HTTPリクエストが正常に処理された後、リクエストをコミットしたクライアントの横にあるすべてのクライアントに通知する必要があります。

誰がこれらの通知を担当する必要がありますか?法的要求を処理した後、私のサーバは単にクライアントに通知を送るべきですか? (これは私が現時点で行っていることです)これが方法の場合、要求を出した人以外のクライアントすべてにどのように通知することができますか?リマインダ - リクエストがHttpでシグナルがプッシュされていないため、クライアント側へのプッシュはハブの外のクラスで発生します。したがって、おそらく示唆したように、ContextまたはClient.Othersプロパティを使用することはできません。どのクライアントに通知する必要があるのか​​分かりませんか?現時点では、私はClients.Allを使用しています。要求を出した人も、私が好きではないことも通知されます。

オプション2は、私のサーバーが成功ステータスコードで応答した後です。リクエストを行ったクライアントは、他のクライアントに通知する責任があります。つまり、彼はメッセージをサーバーにプッシュし、サーバーは他のすべてのクライアントにその通知をプッシュします(今度はシグナルハブ内にあります。 Clients.Others)。

どのアプローチをとるべきですか?

答えて

3

私はあなたの最初のアプローチはシームレスで、実装がかなり簡単だと思います。さらに、ユーザーは通知を担当することも望ましくありません。ユーザーは怠惰です。

基本的に、リクエストを処理した後に例外を検出しなかった場合、SignalRハブコンテキストを取得し、組み込みのSignalR C#APIを使用して、すべてのクライアントにメッセージをブロードキャストします。送信者。

はここにあなたのControllerに行くだろういくつかのコードです:

[Route("ProcessMessage")] 
    public async void ProcessMessage(string[] clientConnectionStrings) 
    { 
     // do some processing 
     var hub = GlobalHost.ConnectionManager.GetHubContext<MessagingHub>(); 

     hub.Clients.AllExcept(clientConnectionStrings); 
    } 

あなたはAllExceptを使用するクライアントの接続IDに合格する必要がありますが、それはかなり容易に統合する必要があります。 (注:SignalRハブと直接対話している場合、あなたがこれを行う必要がないということ)

注:お使いの放送から除外するためのクライアントの接続を取得するには、あなたはそれが好きでアクセスすることができます。

$.connection.hub.id

SignalRハブを直接使用することもできますが、ハブサーバーでイベントをトリガーするには追加のJavaScriptコードが必要になります。たとえば、次のように

$.ajax({ 
     url: 'Some/Url/', 
     type: 'POST', 
     success: function (data) { 
       connection.server.someDataChangeEvent(); 
     }, 
     error: function (ex) { return; } 
    }); 

SignalRハブコード:

public void SomeDataChangeEvent(string connId) 
{ 
    Clients.Others.updateData(_someDataStore.getUpdates().ToList()); 
} 

クライアントコード:

connection.client.updateData = function() { 
    //do stuff 
} 
+0

そのオプションを選択することで、私は別のパラメータを取るためにすべての私の要求を変更する必要があります - クライアントID?そうするより良い方法はありますか?私はすべての作業とテスト済みのAPIを変更するつもりはありません –

+0

私の更新を参照してください。 –

+0

あなたのコードは私の2番目の選択肢を説明していると思います。 –

関連する問題