2017-02-03 4 views
1

これは、角度jsおよびWeb APIを持つ単一ページアプリケーションです。バックグラウンドプロセスが実行されているかどうかをチェックし、クライアントにメッセージをプッシュするメソッドserver.CheckIfRunning()を呼び出すページで、signalrを実装しました。最初にそのページに行くと、通知が正常に取得されます。しかし、別のページに移動してもう一度やり直すと、ページはserver.CheckIfProcessRunning()を正しく呼び出すため、サーバーはクライアントにもプッシュします。ただし、クライアントは通知を受け取りません。Signalr 2プッシュが単一ページアプリケーションに失敗する

クライアント側コード:

var hub = $.connection.tRAHub; 
    hub.client.NotifyAlreadyRunning = function (message) { 
      $scope.$apply(function() { 
       $scope.status=message; 
      }); 
     }; 

    $.connection.hub.start() 
     .done(function() { 
      hub.server.checkIfRunning($.connection.hub.id); 
    }); 

サーバー側のコード:

FYI
public class TRAHub : Hub 
{ 
    public void CheckIfRunning(string id) 
    { 
     var isRunning = CheckIfProcessRunning();//this method checks if the process is running. code not shown 

     if (isRunning) 
     { 
      var client = Clients.Client(id); 
      client.NotifyAlreadyRunning(id); 
     } 
    } 
} 

私はそのページに移動するたびに、クライアント側のコードが実行されます。 誰でも私が間違ったことを教えてもらえますか?あなたは

Clients.Caller.NotifyAlreadyRunning(id); 

を使用しようとすることができ

+0

あなたはOnConnecredをオーバーライドし、そのクライアントが誤って切断されていない見て、サーバ側とクライアント側のイベントをOnDisconnectedすることはできますか?ところで、 'EnableDetailedErrors'を有効にして、クライアント側に例外があるかどうかを調べることができます。 – cassandrad

+0

おかげでcassandrad。私はonconnectedとサーバー上の接続されていないmethosを試してみて、うまく動作するようです。接続します。別のビューにナビゲートすると、それは解消されません。しかし、私がこの見解に戻ったときに再び接続します。これは問題を引き起こしていますか?私はビューを離れるときに切断する必要がありますか?私はクライアント側でイベントを暗示しようとすると、私は何かを見つけることができるかどうかをenabledetailederrorsが見ることができます。 –

答えて

0

最後に、さまざまなオプションをランダムに試してみました。 URL変更イベントでは、別のページに移動しながら、$ .connection.hub.stop()メソッドを呼び出して問題を解決しました。

このhtmlページをロードしているときにstart()を呼び出すため、別のURLに移動中に停止しませんでした。私はこのページに戻ってくると再びつながります。接続IDは変わらないものの、start()メソッドを複数回呼び出すことはうんざりしているとは書かれていませんでしたが、これは問題だったかもしれません。別のURLに移動中にストップメソッドを呼び出すことはトリックをしました!

お世話になりました。ありがとうございました。

1

詳細や他のオプションhereを参照してください。

+0

DDan、それは役に立たなかった。私は問題は、私がSignalRを購読している角度コントローラのイベントにあると思います。初めて正常に動作します。別のURLに行き、ページに戻ったら、再び購読し、CheckIfRunning()メソッドを呼び出します。その後、サーバーはNotifyAlreadyRunning()も正しく呼び出します。しかし、クライアントはそれを認識しません。しかし、ページを更新すると(F5)、再び動作します。私は、ページを離れて再び戻ってくると、サブスクリプションをリセットするリフレッシュが必要だと思います。 –

+0

接続IDは変わりませんか?私はそれがないと思う。 – DDan

+0

はい。接続IDは同じです。これは単一ページアプリケーションなので、リフレッシュされません。接続IDは変わりません。私がF5を押すと、新しいIDと接続します。 –

0

私はサービス内の信号機を抽象化することを提案します。その結果、起動時に一度処理し、サーバーからアクティブ・コントローラーにイベントを転送することができます。 オブザーバーパターンのようなものを実装できます。コントローラ作成時のシグナルサービスからイベントをサブスクリプションで購読解除する。

た既存のangularjs signalRモジュールの可能な解決策もあります: https://github.com/JustMaier/angular-signalr-hub

関連する問題