Почему моя веб-страница теряет возможность получать сигнальные сообщения

В основном у меня есть 3 приложения. Веб-приложение, Nservicebus и собственный сервер signalr для моих концентраторов. В настоящее время я использую signalr версии .4. В основном веб-приложение инициирует соединение с собственным сервером при загрузке страницы. Пользователь выполняет действие, которое отправляет команду по служебной шине. Затем служебная шина подключается к сигнальному серверу, чтобы уведомить всех веб-клиентов.

Моя веб-страница:

<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 браузера. Я инициирую процесс во втором браузере, и только первый получает уведомления. Второй браузер не работает.

Я также не вижу никаких проблем, которые выделяются, когда я запускаю скрипача.

Есть ли лучший подход к этой реализации, или я что-то упустил?


person Etch    schedule 03.05.2012    source источник
comment
Что-нибудь из этого работает? var connection = new HubConnection("http://localhost:8081/test/signalr/hubs"); Строка выше неверна. Вы создаете соединение с URL-адресом концентратора следующим образом: var connection = new HubConnection("http://localhost:8081/test/"); То же самое для URL-адреса концентратора javascript, он должен быть: $.connection.hub.url = 'localhost:8081/test/signalr';   -  person davidfowl    schedule 07.05.2012
comment
Иногда это работает, что заставило меня думать, что я правильно выполняю часть подключения. Если я использую только 1 браузер, все работает правильно (в первый раз), если я пытаюсь выполнить второе действие, он перестает получать уведомления. Но тогда, если я обновлю страницу с нуля, она получит 1 уведомление, а затем больше не получит. После проверки скрипача в другом проекте, который у меня есть, я вижу разницу. Это решение останавливает длительный опрос после получения первого уведомления.   -  person Etch    schedule 07.05.2012
comment
Я проверю, используя соединения, как вы указали.   -  person Etch    schedule 07.05.2012
comment
Это странно. Как будто он вообще не должен работать.   -  person davidfowl    schedule 07.05.2012
comment
Спасибо, Дэвид, ваши комментарии заставили меня двигаться в правильном направлении. Я обновился до версии .5, а затем внимательно изучил, как я работал со строками подключения.   -  person Etch    schedule 21.05.2012


Ответы (1)


OK! Комментарии Дэвида заставили меня двигаться в правильном направлении. Также заметил, что это было обновлено, раньше не замечал этого. Прокрутите вниз, чтобы узнать о междоменной поддержке

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");
person Etch    schedule 21.05.2012