$.соединение не определено + signalR 0.5.3 + MVC4

Боролся с этой ошибкой пасту два часа..

TypeError: $.connection is undefined
[Break On This Error]   

var chatHubClient = $.connection.chatHub;

вот мой Chat.cs (который находится в папке контроллера - я думаю, это то, что я делаю неправильно, но я не могу найти документацию о том, куда его поместить или как его маршрутизировать)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using SignalR.Hubs;

namespace SingalrTest.Controllers
{
    public class Chat
    {
        private readonly static Lazy<Chat> _instance = new Lazy<Chat>(() => new Chat());

        public static Chat Instance
        { get { return _instance.Value; } }
    }

    [HubName("chatHub")]
    public class ChatHub : Hub
    {
        private readonly int TimeoutInSeconds = 30;
        private readonly Chat _chat;

        public ChatHub() : this(Chat.Instance) { }

        private ChatHub(Chat chat)
        {
            this._chat = chat;
        }

        public void Join(string channelName)
        {
            System.Diagnostics.Debug.WriteLine("Someone joined " + channelName);
        }
    }
}

И наконец... мощь _Layout.cs.html

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8" />
        <title>@ViewBag.Title - My ASP.NET MVC Application</title>
        <link href="~/favicon.ico" rel="shortcut icon" type="image/x-icon" />
        <meta name="viewport" content="width=device-width" />

        @Styles.Render("~/Content/css")
        @Scripts.Render("~/bundles/modernizr")
        @Scripts.Render("~/Scripts/jquery-1.8.1.js")
        @Scripts.Render("~/Scripts/jquery.signalR-0.5.3.js")
        @Scripts.Render("~/signalr/hubs")

        <script type="text/javascript">
            $(document).ready(function () {
                // var chatHubClient = jQuery.connection.chatHub;
                var chatHubClient = $.connection.chatHub;

                $.connection.chatHub.start(function () {
                    chatHubClient.join('TEST');
                });
            });
        </script>
    </head>
    <body>
    ...
    </body>
</html>

И если я зайду на /signalr/hubs, я увижу, что источник сгенерирован правильно. Так что же мне не хватает?


person hayer    schedule 12.09.2012    source источник
comment
У меня такая же проблема. По какой-то причине $.connection не определяется, когда происходит событие $.ready. Я как бы исправил это, запустив свой код в строке, а не в готовом событии... Я понятия не имею, почему он исчезает...   -  person Brandon Cuff    schedule 23.09.2012


Ответы (2)


может ты перешел...

Но вот решение.

у вас есть все ваши скрипты в правильном порядке в теге head. Но _Layout.cshtml из шаблона Visual Studio имеет следующие строки в конце тега body.

@Scripts.Render("~/bundles/jquery")
@RenderSection("scripts", required: false)

В этом комплекте есть библиотека jQuery, которая перезаписывает объект $ при загрузке. Таким образом, любые «вещи» в этой настройке от SignalR теперь перезаписываются и недоступны.

просто используйте следующее на своей странице.

@section scripts {
    @* Load your scripts here. (and remove jQuery, coz it's already loaded) *@
}

Надеюсь это поможет.

person Madushan    schedule 19.02.2013
comment
Будет ли jQuery правильно упакован, когда он загружен? Я бы предпочел, чтобы упаковщик загружал jQuery как часть пакета, а затем повторно запускал материал signalR. - person Shawn Hubbard; 02.06.2013
comment
да. Вам нужно только загрузить SignalR. и убедитесь, что вы загружаете его ПОСЛЕ jQuery. (секция скриптов запускается после загрузки jQuery. скрипты в ‹head› запускаются до.. в конфигурации по умолчанию.) - person Madushan; 02.06.2013

Согласно this, для версии 0.5.3 необходимо изменить синтаксис подключения:

var connection = $.hubConnection();

или направить трафик на вторичный сервер

var connection = $.hubConnection("http://localhost:58416/");

подключиться к хабу:

var hub = connection.createProxy('your_hub_name');

И еще некоторые изменения при отправке и получении сообщений.

Надеюсь, это поможет

person Kent    schedule 24.09.2012