2017-12-19 31 views
1

SignalRを使用してコントローラからクライアントにメッセージを送信しようとしています。 私のコントローラの1つでイベントが発生すると、クライアントの画面に警告のように表示されるように、signalrハブを使ってメッセージをプッシュする必要があります。 多くの質問がここで尋ねられていることを知っており、私はそれらを読んで多く試しました。私がSignalRを初めて習得したので、それらのうちのいくつかは既に私が物事を整えるのに役立っています。 現時点ではすべてのものが整っているようです。クライアントはハブに接続してグループに参加でき、コントローラはハブからメソッドを呼び出すことができます。しかし、クライアントはメッセージを受け取ることはありません。理由を理解できません。私はコントローラによって呼び出されるハブのメソッドはクライアントを "見ない"と思うが、何が間違っているのか分からない。コントローラからSignalRメッセージを受信して​​いないクライアント

ハブのコード:ここで

public static class UserHandler 
{ 
    public static HashSet<string> ConnectedIds = new HashSet<string>(); 
} 

[HubName("myHub")] 
public class MyHub : Hub 
{ 
    private static IHubContext hubContext = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); 
    public void Notify(string groupName, string message) 
    { 
     Clients.Group(groupName).displayNotification(message); 
    } 

    public static void Static_Notify(string groupName, string message) 
    { 
     var toto = UserHandler.ConnectedIds.Count(); 
     hubContext.Clients.Group(groupName).displayNotification(message); 
     hubContext.Clients.All.displayNotification(message);//for testing purpose 
    } 

    public Task JoinGroup(string groupName) 
    { 
     return Groups.Add(Context.ConnectionId, groupName); 
    } 

    public Task LeaveGroup(string groupName) 
    { 
     return Groups.Remove(Context.ConnectionId, groupName); 
    } 

    public override Task OnConnected() 
    { 
     UserHandler.ConnectedIds.Add(Context.ConnectionId); 
     return base.OnConnected(); 
    } 

    public override Task OnDisconnected(bool StopCalled) 
    { 
     UserHandler.ConnectedIds.Remove(Context.ConnectionId); 
     return base.OnDisconnected(StopCalled); 
    } 
} 

は私のコントローラからの呼び出しです:

//(For simplification and readability I define here variables actually obtained by treating some data) 
//I already checked that problem did not come from missing data here 
string groupName = "theGroupName"; 
string message = "My beautifull message."; 

//prepare signalR call 
var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); 

//Following commented lines are different attempts made based on exemples and answers I found here and on others sites. 
//The uncommented one is the one in use at the moment and is also based on an answer (from SO i think) 

//context.Clients.Group(_userEmail).displayNotification(message); 
//context.Clients.Group(_userEmail).Notify(_userEmail,message); 
    MyHub.Static_Notify(_userEmail, message); 

そしてここでは、クライアント側のコードです:

$(document).ready(function() { 
    var userGroup = 'theGroupName'; 
    $.connection.hub.url = 'http://localhost/SignalRHost/signalr'; 
    var theHub = $.connection.myHub; 
    console.log($.connection) 
    console.log($.connection.myHub) 

    theHub.client.displayNotification = function (message) { 
     console.log('display message'); 
     alert(message); 
    }; 

    $.connection.hub.start() 
     .done(function() { 
      theHub.server.joinGroup(userGroup); 
      console.log("myHub hub started : " + $.connection.hub.id) 
      console.log(theHub) 
     }) 
     .fail(function() { 
      console.log('myHub hub failed to connect') 
     }); 

}); 

私は何を理解して助けてください論理私は理解できなかったか、何が間違っているのか分からなかった。

EDIT:

アリスソンさんのコメントに答えるために:

  • Startup.csを私はあまりにも言及するのを忘れてしまった

    public void Configuration(IAppBuilder app) 
        { 
         app.Map("/signalr", map => 
         { 
          map.UseCors(CorsOptions.AllowAll); 
          var hubConfiguration = new HubConfiguration { }; 
          map.RunSignalR(); 
         }); 
        } 
    

    重要なものを表示するために忘れてしまいましたコントローラ、ハブ、およびクライアントは3つの異なるプロジェクトです(グローバルなアプリケーションのためアーキテクチャ上で私は)すべてが私のローカルホストのIIS上ではなく、異なるポート上にある をハブ・ロジックを分離するために持っていた

  • 私は「OnConnected」と「onDiconnected」のイベントにブレークポイントを設定して、クライアントが接続し、正常に切断
+0

ローカルホストでMVCプロジェクトが実行されていますか?つまり、ローカルのIISにプロジェクトを公開したのですか、Visual StudioからIIS Expressを使用してプロジェクトをデバッグしていますか? 'Startup.cs'ファイルでSignalRをどのように設定したのか分かりますか? – Alisson

+0

重要な情報を指摘してくれてありがとう@Alisson言及するのを忘れてしまった。私はあなたの質問にポストの一番下に答えました。 – Grey

+0

コントローラーとハブが別々のプロジェクトにある場合、それは機能しません。 SignalRサーバーとして機能する2つのプロジェクト、コントローラーのプロジェクト、およびハブのプロジェクト(両方のプロジェクトで同じHubクラスを共有していても)があります。コントローラでMyHub.Static_Notify(_userEmail、message);を呼び出すと、Hubはコントローラプロジェクトに接続しているクライアントを呼び出していますが、クライアントは実際にSignalRHostプロジェクトに接続しています。ハブとコントローラにはそれぞれ独自のプロジェクトを使用するか、コントローラがSignalRHostプロジェクトでハブを呼び出すようにする必要があります。 – Alisson

答えて

0

あなたにあなたのケースではSIgnalRHostプロジェクトでなければなりません。

Install-Package Microsoft.AspNet.SignalR.Client 

お使いのコントローラプロジェクトが実際にハブクラスを含むプロジェクトを参照する必要はありません:あなたのコントローラプロジェクトは、したがって、それだけでこのパッケージを必要とする、サーバーのクライアントである必要があります。

var hubConnection = new HubConnection("http://localhost/SignalRHost/signalr"); 
IHubProxy myHub = hubConnection.CreateHubProxy("MyHub"); 
await hubConnection.Start(); 
myHub.Invoke("JoinGroup", "theGroupName"); 
myHub.Invoke("Notify", "theGroupName", "My beautifull message."); 

...最後に、あなたはドン」:あなたのコントローラでは、あなたは(あなたはjavascriptをクライアントに行うように)、サーバーへの接続グループに参加し、ハブメソッドを呼び出すためにC#SignalRクライアントを使用します必ずStatic_Notifyが必要です。

あなたはNotify 法上のパラメーターとしてグループ名を渡しているので、あなたが本当にあなたのコントローラからグループに参加する必要はありません。 コントローラが接続された同じ グループにメッセージを送信しようとしていた場合にのみ必要です(この場合、パラメータとして グループ名を渡す必要はありません)。

SignalR C# Client Reference

+0

ありがとう、私は完全にC#クライアントの部分を逃した。それは完全に動作します。 – Grey

関連する問題