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

SignalR "signalr/hubs", дающий 404 ошибку

Я использую SignalR (https://github.com/SignalR/SignalR) в своем проекте. Отсюда https://github.com/SignalR/SignalR/wiki/QuickStart-Hubs Я понял, как использовать концентраторы. Но "signalr/hubs" script дает ошибку 404. Вот URL, который становится в View Source: 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">
....
4b9b3361

Ответ 1

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

Ответ 2

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

        RouteTable.Routes.MapHubs();
        RouteConfig.RegisterRoutes(RouteTable.Routes);

Ответ 3

Из 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();
        }
    }
}

Ответ 4

В моем случае основная причина этого 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();
        }
    }
}

Ответ 5

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

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

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

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

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

Я думаю, что имя параметра довольно наглядное. Удалите это или измените false на true.

Ответ 6

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

c:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i

Ответ 7

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

Как

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

Смотрите Часто задаваемые вопросы о SignalR на GitHub

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

Ответ 8

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

enter image description here

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

Ответ 9

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

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

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

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

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

Ответ 10

Это полный ответ из вики SignalR (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:

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

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

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

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

<configuration>
   <system.webServer>
        <modules runAllManagedModulesForAllRequests="true">
        </modules>
    </system.webServer>
</configuration>

Ответ 11

Мой проект - веб-приложение ASP.net 4.0 С#, среда тестирования - Windows Server 2012.

У меня была такая же проблема с 1.0.0 RC2, я сделал то, что предлагает Майкл, и это работает. Спасибо.

@MatteKarla: при установке SignalR 1.0.0 RC2 от NuGet в проект добавляются следующие ссылки:

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

Мне нужно добавить Microsoft.CSharp вручную или после компиляции произойдет следующая ошибка:

  • Предопределенный тип "Microsoft.CSharp.RuntimeBinder.Binder" не определен или не импортирован

Ответ 12

У меня были эти 404 ошибки, когда я обновился до Signalr 2.0 и развернул проект MVC на рабочий сервер. Проект публикации с параметром "удалить все существующие файлы до публикации" сохранил мои проблемы.

надеюсь, что это поможет кому-то.

Ответ 13

Я тоже сталкивался с этой проблемой в приложении ASP.NET 4.0 Web Forms. Он работал на серверах разработки, но не в производственных средах. Решение о том, что все запросы/модули выполняются в управляемом режиме, нам не подходит.

Решение, которое мы спустили (лучше для веб-форм ASP.NET), следующее. Добавьте в Web.Config следующий раздел:

<modules>
  <remove name="UrlRoutingModule-4.0" />
  <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="" />
  <!-- any other modules you want to run in MVC e.g. FormsAuthentication, Roles etc. -->
</modules>

Ответ 14

Возможно, стоит упомянуть: я запускаю приложение Web Forms, которое использует его собственную ручную маршрутизацию. Поскольку запуск OWIN происходит после того, как таблицы маршрутизации были установлены, маршрут для /signalr/hubs никогда не попадал. Я добавил правило, чтобы игнорировать маршруты (IE: пусть веб-формы выполняют маршрутизацию) на любом пути, начинающемся с "/signalr". Это решило мою проблему.

Ответ 15

Я решил эту проблему, переключив пул приложений .NET Framework Version с версии 2.0 на v4.0.

Ответ 16

может быть из-за того, что ваше имя класса концентратора является "Test", и вы ссылаетесь на "тест" на стороне клиента.

Ответ 18

Для меня решение было переустановить все пакеты и восстановить все зависимые.

Откройте команду powershell для nuget и используйте эту команду.

Update-Package -Reinstall

Ответ 19

добавление app.MapSignalR(); в класс Startup устраняет проблему

Ответ 20

Ваша проблема в коде сервера. Просто поместите app.UseSignalR(), прежде чем app.UseSpaStaticFiles() в Startup.cs файле