Подтвердить что ты не робот

SignalR не может читать клиент свойств undefined

Я пытаюсь добавить SignalR в свой проект (ASPNET MVC 4). Но я не могу заставить его работать.

На следующем изображении вы можете увидеть ошибку, которую я получаю. image Я прочитал много сообщений о stackoverflow, но ни один из них не разрешает мою проблему.

Это то, что я сделал до сих пор:

1) Ran Install-Package Microsoft.AspNet.SignalR -Pre
2) Added RouteTable.Routes.MapHubs(); in Global.asax.cs Application_Start()
3) If I go to http://localhost:9096/Gdp.IServer.Web/signalr/hubs I can see the file content
4) Added <modules runAllManagedModulesForAllRequests="true"/> to Web.Config
5) Created folder Hubs in the root of the MVC application
6) Moved jquery and signalR scripts to /Scripts/lib folder (I'm not using jquery 1.6.4, I'm using the latest)

Это мой index.cshtml

<h2>List of Messages</h2>

<div class="container">
    <input type="text" id="message" />
    <input type="button" id="sendmessage" value="Send" />
    <input type="hidden" id="displayname" />
    <ul id="discussion">
    </ul>
</div>

@section pageScripts
{
    <!--Reference the SignalR library. -->
    <script src="@Url.Content("~/Scripts/jquery.signalR-1.0.0-rc1.min.js")" type="text/javascript"></script>
    <!--Reference the autogenerated SignalR hub script. -->
    <script type="text/javascript" src="~/signalr/hubs"></script>
    <script src="@Url.Content("~/Scripts/map.js")" type="text/javascript"></script>
}

Это мой файл IServerHub.cs(находится внутри папки Hubs)

namespace Gdp.IServer.Ui.Web.Hubs
{
    using Microsoft.AspNet.SignalR.Hubs;
    [HubName("iServerHub")]
    public class IServerHub : Hub
    {
        public void Send(string name, string message)
        {
            Clients.All.broadcastMessage(name, message);
        }
    }
}

И это map.js

$(function () {

    // Declare a proxy to reference the hub. 
    var clientServerHub = $.connection.iServerHub;

    // Create a function that the hub can call to broadcast messages.
    clientServerHub.client.broadcastMessage = function (name, message) {
        $('#discussion').append('<li><strong>' + name + '</strong>:&nbsp;&nbsp;' + message + '</li>');
    };

    // Get the user name and store it to prepend to messages.
    $('#displayname').val(prompt('Enter your name:', ''));

    // Set initial focus to message input box.  
    $('#message').focus();

    // Start the connection.
    $.connection.hub.start().done(function () {
        $('#sendmessage').click(function () {
            // Html encode display name and message. 
            var encodedName = $('<div />').text($('#displayname').val()).html();
            var encodedMsg = $('<div />').text($('#message').val()).html();

            // Call the Send method on the hub. 
            clientServerHub.server.send(encodedName, encodedMsg);

            // Clear text box and reset focus for next comment. 
            $('#message').val('').focus();
        });
    });
});

В DLL я вижу ссылки для SignalR:

  • Microsoft.AspNet.SignalR.Core
  • Microsoft.AspNet.SignalR.Owin
  • Microsoft.AspNet.SignalR.SystemWeb

Любые идеи, как заставить его работать? Должен ли я делать какие-либо изменения, потому что скрипты находятся в папке / Script/lib?

Примечание Я следую инструкции, найденной здесь о том, как настроить Виндзорский замок, чтобы заставить его работать с SignalR, и снова кажется, что прокси-сервер не может быть создан, и я получение той же самой ошибки:

Cannot read property client of undefined

означает, что прокси-сервер для концентратора не был создан

Вот как я на сервере

public class IncidentServerHub : Hub

и т.д. в клиенте

var clientServerHub = $.connection.incidentServerHub;

Снова, я вижу динамически созданный файл здесь:

/GdpSoftware.Server.Web/signalr/hubs

Итак, почему прокси не создан?

Спасибо заранее! Гильермо.

4b9b3361

Ответ 1

Я исправил эту проблему, изменив код js:   var myHub = $.connection.SentimentsHub; в   var myHub = $.connection.SentimentsHub;

Итак, если у вас есть хаб с именем класса TestHub, вы должны использовать имя testHub (первая буква строчного) в js

Ответ 2

Для тех, кто пытался добавить сгенерированный путь прокси файла в комплекте.

Не включайте "~/signalr/hubs" в свой BundleConfig.cs.

У вас может быть JQuery.SignalR в комплекте:

bundles.Add(new ScriptBundle("~/bundles/signalr").Include(
                  "~/Scripts/jquery.signalR-{version}.js"));

Но вам нужно добавить "/signalr/hubs" в ваш взгляд:

@section Scripts {
    @Scripts.Render("~/bundles/signalr")
    @Scripts.Render("/signalr/hubs")
}

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

Ответ 3

У меня было то же сообщение об ошибке и разрешила проблему, установив опечатку, которую я имел в атрибуте [HubName] в классе концентратора, - это не совсем соответствовало свойству на JavaScript-стороне клиента.

Класс класса С#:

[HubName("gameHub")]
public class GameHub : Hub
{

клиентский javascript:

var foo = $.connection.gameHub;

"gameHub" должен быть одним и тем же.

HTH

Ответ 4

Для ASP.Net MVC:
Проверьте _Layout.cshtml
Если вы вызываете пакет jquery после "@RenderBody()" , вы получите эту ошибку.

Resoultion: Просто переместите "@Scripts.Render(" ~/bundles/jquery ") в раздел заголовка или напишите все скрипты signalr в разделе "

Ответ 5

Ваши классы-концентраторы должны быть определены как общедоступные. Например:

class ChatHub : Hub

должен быть

public class ChatHub : Hub

Ответ 6

Хорошо, я нашел проблему, мне нужно было сделать следующее:

Эти две ссылки отсутствовали:

Microsoft.AspNet.SignalR.Hosting.AspNet
Microsoft.AspNet.SignalR.Hosting.Common

Теперь я включил их в пакет nuget: WebApiDoodle.SignalR, который использует эти два. Мой вопрос в том, почему эти Dll не были добавлены, я установил пакет Nuget: Microsoft.AspNet.SignalR -Pre?

ошибка?

Тогда у меня это было в my global.asax.cs

using SignalR;

так

RouteTable.Routes.MapHubs();

использовал этот, мне нужно было удалить это использование и использовать его:

using Microsoft.AspNet.SignalR;

Итак, MapHubs используют этот и начинают работать.

Надеюсь, это поможет другим. Гильермо.

Ответ 7

Вы должны поставить скрипты SignalR и jQuery в правильном порядке:

<script src="/Scripts/jquery-1.6.4.min.js" ></script>

<script src="/Scripts/jquery.signalR-1.1.4.js"></script>

<script src="/signalr/hubs"></script> 

Ответ 8

Создание класса Hub "public" решило его для меня.

Ответ 9

В моем случае я потерял Microsoft.Owin.Host.SystemWeb.dll & Microsoft.Owin.Security.dll в моем проекте. После добавления ссылок на них эта ошибка была устранена. это работает сейчас.