3

基本的に私は3つのアプリを持っています。Webアプリ、Nservicebus、およびハブ用のSignalrセルフホスティングサーバー。現在、Signalerバージョン.4を使用しています。基本的に、Webアプリは、ページの読み込み時にセルフホストサーバーとの接続を開始します。ユーザーは、サービスバスにコマンドを送信するアクションを実行します。次に、サービスバスはSignalerサーバーに接続して、すべてのWebクライアントに通知します。

私のWebページ:

<script src="http://localhost:8081/test/signalr/hubs" type="text/javascript"></script>
<script>
    jQuery.support.cors = true;
    var myHub;  

    $.connection.hub.url = 'http://localhost:8081/test/signalr/hubs';

    $(function () {
        myHub = $.connection.userAccountHub;

        myHub.ChangeNameUpdated = function (connId) {
            alert("recieved signalr message");          
        };

        $.connection.hub.start().done(function() {
            var myClientId = $.connection.hub.id;
            setCookie("srconnectionid", myClientId);
        });
    });

</script>

私のSignalRサーバー:

      static void Main(string[] args)
    {
        Debug.Listeners.Add(new ConsoleTraceListener());
        Debug.AutoFlush = true;

        string url = "http://localhost:8081/test/";
        var server = new Server(url);


        server.EnableHubs();
        server.Start();


        Console.WriteLine("Server running on {0}", url);

        while (true)
        strong text{
            ConsoleKeyInfo ki = Console.ReadKey(true);
            if (ki.Key == ConsoleKey.X)
            {
                break;
            }
        }
    }

Signalrサーバープロジェクト内のハブ

 public class UserAccountHub : Hub
    {

        public void UsersNameChanged(string passedThroughConnectionId)
        {
            Clients.ChangeNameUpdated(passedThroughConnectionId);
        }
    }

私のnservicebusからの私の呼び出し

        //connect to signalRServer
        var connection = new HubConnection("http://localhost:8081/test/signalr/hubs");
        IHubProxy myHub = connection.CreateProxy("SignalRServer.Hubs.UserAccountHub");

        //Credentials are inherited from the application
        connection.Credentials = CredentialCache.DefaultNetworkCredentials;

        var test = message.GetHeader("signalrConnectionId");


        connection.Start().Wait();
        myHub.Invoke("UsersNameChanged", message.GetHeader("signalrConnectionId")).ContinueWith(task =>
        {
            //for debuging purposes
            if (task.IsFaulted)
            {
                Console.WriteLine(
                    "An error occurred during the method call {0}",
                    task.Exception.GetBaseException());
            }
            else
            {
                Console.WriteLine("Successfully called MethodOnServer");
            }
        });

2つのブラウザを開きます。2番目のブラウザーでプロセスを開始すると、最初のブラウザーのみが通知を受け取ります。2番目のブラウザはそうではありません。

フィドラーを実行しても目立つ問題はありません。

この実装へのより良いアプローチはありますか、それとも私は何かを逃していますか?

4

1 に答える 1

2

わかった!デビッドのコメントは私を正しい方向に向かわせました。また、これが更新されたことに気づきましたが、以前は気づいていませんでした。 クロスドメインサポートについては、一番下までスクロールしてください

1.)バージョン.5に更新

2.)javascriptの接続情報を次のように変更しました

$.connection.hub.url = 'http://localhost:8081/test/signalr';

$.connection.hub.start({ transport: 'longPolling', xdomain: true }).done(function () {
    //alert("staring hub connection:  " + $.connection.hub.id);
    setCookie("srconnectionid", $.connection.hub.id);
});

3.)私は変更しなければなりませんでしたHubConnection

var connection = new HubConnection("http://localhost:8081/test/");

4.)私は変更しなければなりませんでしたIHubProxy

IHubProxy myHub = connection.CreateProxy("UserAccountHub");
于 2012-05-21T18:59:46.000 に答える