SignalR "сигнализатор / концентратор", выдающий ошибку 404 - PullRequest
49 голосов
/ 20 января 2012

Я использую SignalR (https://github.com/SignalR/SignalR) в моем проекте. Отсюда https://github.com/SignalR/SignalR/wiki/QuickStart-Hubs Я получил представление о том, как использовать концентраторы. Но скрипт "signalr / hubs" выдает ошибку 404. Вот URL, которыйстановится в представлении Источник: http://localhost:50378/signalr/hubs дает ошибку 404

Вот мой код: Hub:

public class Test:Hub
{
    public void Start()
    {
        Caller.guid = Guid.NewGuid();
    }

    public void TestMethod()
    {
        Clients.show("test", Caller.guid);
    }
}

ASPX:

<html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title>Title</title>
        <script src="../Scripts/jquery-1.6.4.min.js" type="text/javascript"></script>
        <script src="../Scripts/jquery.signalR.js" type="text/javascript"></script>
        <script src="<%= ResolveUrl("~/signalr/hubs") %>" type="text/javascript"></script>
        <script type="text/javascript">

            $(document).ready(function () {
                var test = $.connection.test;
                $("#btnTest").click(function () {
                    test.testMethod();
                });
                test.show = function (text, guid) {
                    if (guid != test.guid) //notify all clients except the caller
                        alert(text);
                };
                $.connection.hub.start(function () { test.start(); });
            });

        </script>
    </head>
    <body>
        <form id="HtmlForm" runat="server">
            <div>

            </div>
        </form>
    </body>
</html>

Web.config:

  <system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
    <modules runAllManagedModulesForAllRequests="true">
....

Ответы [ 19 ]

44 голосов
/ 15 марта 2013

Попробуйте вызвать RouteTable.Routes.MapHubs () перед RouteConfig.RegisterRoutes (RouteTable.Routes) в Global.asax.cs, если вы используете MVC 4. Это работает для меня.

        RouteTable.Routes.MapHubs();
        RouteConfig.RegisterRoutes(RouteTable.Routes);
29 голосов
/ 20 января 2012

Возможно, вы не добавили ссылку на SignalR.AspNet.dll.Если я правильно помню, он отвечает за добавление маршрута к /signalr/hubs.

14 голосов
/ 23 января 2013

В SignalR 1.0.0 RC2 в папке пакетов находится README, в котором говорится, что маршрут концентраторов должен быть установлен вручную. :) Вот фрагмент ...

using System;
using System.Web;
using System.Web.Routing;

namespace MyWebApplication
{
    public class Global : System.Web.HttpApplication
    {
        public void Application_Start()
        {
            // Register the default hubs route: ~/signalr
            RouteTable.Routes.MapHubs();
        }
    }
}
14 голосов
/ 12 февраля 2015

В моем случае, главная причина этого 404 - это то, что концентраторы не были правильно отображены.RouteTable.Routes.MapHubs(); устарел.Для отображения концентраторов вы можете создать класс запуска, как показано ниже.

[assembly: OwinStartup(typeof(WebApplication1.Startup))]
namespace WebApplication1
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            // Any connection or hub wire up and configuration should go here
            app.MapSignalR();
        }
    }
}
13 голосов
/ 11 февраля 2016

Я тоже боролся с этой проблемой и, наконец, дошел до того, что стало причиной проблемы.Прежде всего, я должен сказать, что с SignalR v2 вызов RouteTable.Routes.MapHubs(); внутри Globalasax / Application_Start устарел, а компилятор даже выдает предупреждение.Вместо этого мы теперь добавляем выделенный класс StartUp со следующим открытым методом:

public void Configuration(IAppBuilder app)
{
    app.MapSignalR();
}

Вся конфигурация идет здесь. Для получения дополнительной информации см. Документацию .

Теперь,потратив много часов на поиски, как сумасшедший, я решил добавить исключение в метод Configure класса StartUp, о котором я упоминал ранее.Если бы не было никаких исключений, я бы понял, что Овин даже не запускается.Мое предположение было правильным.По какой-то причине Овин не запускался или что-то подавляло это.В моем случае это был злой параметр конфигурации в моем файле web.config:

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

Полагаю, название параметра довольно наглядно.Либо удалите это, либо измените false на true.

4 голосов
/ 08 января 2014

Вы только что установили IIS? В этом случае вам, возможно, придется переустановить его:

c:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i
3 голосов
/ 31 декабря 2012

У меня была такая же проблема при запуске кода с использованием сервера разработки Visual Studio, и она работала, когда я изменил настройки своего проекта для использования IIS Local Web Server.

enter image description here

Был обнаружен дефект в этой проблеме, который прокомментировал Дэвид Фаулер. Проблема будет исправлена ​​в будущих версиях, но сейчас это обходной путь. Я не могу найти ссылку на ошибку в данный момент.

3 голосов
/ 23 мая 2014

Короче говоря: в моем случае я использовал R # (ReSharper) , щелкнул правой кнопкой мыши мой проект, который использует SignalR, и щелкнул Refactor => Remove Unused References.Осторожно: это выстрел в ногу .: D

Удалены ВАЖНЫЕ ссылки на DLL из SignalR, которые используются только во время выполнения, то есть они не нужны во время компиляции.Очевидно, R # проверяет только зависимости времени компиляции.

А именно, отсутствовали эти 2 ссылки:

  1. Microsoft.AspNet.SignalR.SystemWeb
  2. Microsoft.Owin.Host.SystemWeb (без этого точка останова в SignalR метод настройки OWIN даже не будет достигнута).

Удалил пакеты NuGet, а затем переустановил их.Исправлена ​​проблема /hubs 404.

3 голосов
/ 27 января 2012

Вам нужно сослаться на файл JavaScript с @Url.Content, если вы используете ASP.NET MVC3

Как:

<script src="@Url.Content("~/Scripts/jquery.signalR.min.js")" type="text/javascript"></script>

См. SignalR FAQ на GitHub

Редактировать: Как упомянул Тревор Де Коеккок в их комментарии, вам не нужно добавлять @Url.Content самостоятельно, если вы используете MVC4 или новее. Достаточно просто добавить URI с ~/. Для получения дополнительной информации, проверьте этот другой вопрос SO .

2 голосов
/ 18 мая 2014

Это полный ответ от SignalR wiki (https://github.com/SignalR/SignalR/wiki/Faq). Это сработало со мной:

Во-первых, убедитесь, что у вас есть вызов MapHubs () в Global.asax.

Убедитесь, что маршрутный концентратор зарегистрирован перед любыми другими маршрутами в вашем приложении.

RouteTable.Routes.MapHubs();

В ASP.NET MVC 4 вы можете делать следующее:

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

Есливы пишете приложение MVC 3, убедитесь, что вы используете Url.Content для ссылок на сценарии:

<script type="text/javascript" src="@Url.Content("~/signalr/hubs")"></script>

Если вы пишете обычное приложение ASP.NET, используйте ResolveClientUrl для ссылок на сценарии:

<script type="text/javascript" src='<%= ResolveClientUrl("~/signalr/hubs") %>'></script>

Если вышеупомянутое все еще не работает, убедитесь, что в вашем файле web.config установлен RAMMFAR:

<configuration>
   <system.webServer>
        <modules runAllManagedModulesForAllRequests="true">
        </modules>
    </system.webServer>
</configuration>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...