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

/signalr/хабы не загружаются в asp.net mvc4: Throws 404

Вот что я сделал.

  • Я использовал nuget для получения SignalR для моего проекта MVC4.
  • Создал класс MyHub в моем контроллере (SignalRTestController.cs)
  • В действии указателя попытался транслировать сообщение извне хаба и вернул представление.
  • В представлении указаны все сценарии и /signalr/hubs.

Проблема в том, что /signalr/hubs не найден (выбрасывает 404).

Мой проект имеет области и структурирован, как показано:

  • MVCProject
    • Районы
      • ПОДПАПКА
        • Контроллер
          • SignalRTestController.cs
        • Model
        • Просмотр
          • Index.cshtml
    • контроллер
    • Model
    • Вид
    • Сценарии

Все сценарии для signalR находятся внутри папки Scripts, а мой SignalRTestController.cs выглядит так:

namespace SignalRTest.Controllers
{
public class SignalRTestController : Controller
{
    public ActionResult Index()
    {
        // Do some work here

        // Broadcasting over a Hub from outside of a Hub
        var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
        context.Clients.say("Hello SignalR!");

       return View();
    }
}

[HubName("MyHub")]
public class MyHub : Hub
{
    public void Say(string message)
    {
        Clients.sendMessage(message);
    }
}
}

Любой мой index.cshtml имеет ссылку на все javascripts и /signalr/hubs, как показано ниже: // Другие Javascripts

script type = "text/javascript" src= "/signalr/hubs" /" >

Я думаю, что контроллер в порядке, но я не получаю /signalr/hubs. Он бросает 404, а сообщение в Chrome Console выглядит так:

Ресурс интерпретируется как Script, но передается с текстом типа MIME/html: "http://www.myproject.com/signalr/hubs". Uncaught SyntaxError: Неожиданный токен < концентраторы: 2 Uncaught SignalR: Ошибка загрузки концентраторов. Убедитесь, что ссылка на концентраторы верна, например. script src= '/signalr/hubs' > .

Причина, по которой возвращается Script, так как html возвращает сервер, 404 не найден.

Я не уверен, что случилось. Я думаю, что это может быть проблема маршрутизации. Я не уверен, если нам нужно добавить любую информацию о маршрутизации в проект для /signalr/hubs или я что-то пропустил здесь.

FYI: Когда я создаю новый пустой проект MVC и добавляю signalR и начинаю работать над ним, он отлично работает. Нет необходимости добавлять маршрутизацию.

Кроме того, я использую как маршрутизацию по умолчанию, так и маршрутизацию атрибутов в некоторых местах. Но контроллер SignalRTestController не использует маршрутизацию атрибутов.

4b9b3361

Ответ 1

Есть ли у вас вызов RouteTable.Routes.MapHubs() (возможно, в Global.asax)? Если да, попробуйте избавиться от этого и увидеть, исправляет ли он вашу проблему. - Пит 16 ноября в 17:22

Я играл с ним еще немного. Похоже, что в текущей версии (я получил последний источник, потому что мне нужна подписанная сборка), вам нужно вызвать RouteTable.Routes.MapHubs(). Но для этого он должен был быть вызван первым (или, по крайней мере, до вызова RouteConfig.RegisterRoutes()). Если он был вызван после этого, MVC отправляется на поиски контроллера для этого, и это не работает. В более ранней версии, которую я использовал, полученной через nuGet, удаление RouteTable.Routes.MapHubs() помогло устранить проблему, но теперь она кажется необходимой. Надеюсь, что это полезно. - Пит 27 ноября в 20:53


По-видимому, вы решили проблему, изменив RouteTable.Routes.MapHubs() на: RouteTable.Routes.MapHubs( "~/signalr" ).

Ответ 2

У меня была та же проблема. Вот исправление:

Nuget не добавил все необходимые ссылки. Я перезапустил эту команду:

Install-Package Microsoft.AspNet.SignalR -pre

и он добавил еще несколько ссылок:

  • Microsoft.AspNet.SignalR.Hosting.Aspnet
  • Microsoft.AspNet.SignalR.Hosting.Common

как только это было сделано, он работал как чемпион!

Ответ 3

MapHubs теперь устарел. Используйте метод расширения MapSignalR в классе запуска Owin, например:

[assembly: OwinStartupAttribute(typeof(signalr_test.Startup))]
namespace signalr_test
{
    public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            ConfigureAuth(app);
            app.MapSignalR(); //can take path also see overloads...
        }
    }
}

Ответ 4

У вас есть проблема со ссылкой. выполните следующие действия:

  • В вашем приложении AppStart/Bundle.Config.cs добавьте это:

    bundles.Add(new ScriptBundle("~/bundles/signalR").Include(
        "~/Scripts/jquery.signalR-{version}.js"));
    
  • В layout.cshtml добавьте это:

    @Scripts.Render( "~/пучки/signalR" )

  • На вашей странице, с которой вы используете signalR, убедитесь, что вы ссылаетесь на такие концентраторы signalR:

/signalr/концентраторы

как это сделано на этой странице: http://blog.devscrum.net/2011/12/getting-started-with-signalr-in-asp-net-mvc/ (раздел, где говорится: "В index.cshtml добавить следующий код" )

Ответ 5

Попробуйте изменить [HubName("MyHub")] на [HubName("MyHub")] и убедитесь, что вы обновляете везде, где вы создаете прокси-сервер в своем javascript. Это работало для меня в прошлом.

Ответ 6

В моем случае я случайно создал два класса Hub с одинаковым именем в разных местах (два класса, которые происходят из Hub). Я удалил один, и все это сработало.

Ответ 7

В моем случае был ключ в настройках web.config appSettings, который мне пришлось удалить:

<add key="owin:AutomaticAppStartup" value="false" />