Ответ 1
Возможно, вы не добавили ссылку на SignalR.AspNet.dll
. Если я правильно помню, он отвечал за добавление маршрута в /signalr/hubs
.
Я использую 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">
....
Возможно, вы не добавили ссылку на SignalR.AspNet.dll
. Если я правильно помню, он отвечал за добавление маршрута в /signalr/hubs
.
Попробуйте вызвать RouteTable.Routes.MapHubs() перед RouteConfig.RegisterRoutes(RouteTable.Routes) в Global.asax.cs, если вы используете MVC 4. Это работает для меня.
RouteTable.Routes.MapHubs();
RouteConfig.RegisterRoutes(RouteTable.Routes);
Из 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();
}
}
}
В моем случае основная причина этого 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();
}
}
}
Я тоже боролся с этой проблемой и, наконец, дошел до того, что вызывало эту проблему. Прежде всего, я должен сказать, что с 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.
Вы только что установили IIS? В этом случае вам придется переустановить его:
c:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i
Вам нужно ссылаться на файл 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.
У меня была такая же проблема при запуске моего кода с использованием сервера разработки Visual Studio, и он работал, когда я изменил настройки своего проекта на использование локального веб-сервера IIS.
Был отмечен недостаток в этом вопросе, о котором прокомментировал Дэвид Фаулер. Проблема будет исправлена в будущих выпусках, но сейчас это обходное решение. На данный момент я не могу найти ссылку на ошибку.
Короче говоря: в моем случае я использовал R # (ReSharper), щелкнул правой кнопкой мыши мой проект, который использует SignalR, и нажал Refactor = > Удалить неиспользуемые ссылки. Остерегайтесь: это стрелять в ногу.: D
Он удалил ВАЖНЫЕ ссылки DLL из SignalR
, которые используются только во время выполнения, то есть они не нужны во время компиляции. Очевидно, что R # проверяет только временные зависимости компиляции.
А именно, эти две ссылки отсутствовали:
SignalR
Метод настройки OWIN даже не будет удален).Удалены пакеты NuGet, а затем переустановлены. Исправлена проблема с /hubs
404.
Это полный ответ из вики 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>
Мой проект - веб-приложение ASP.net 4.0 С#, среда тестирования - Windows Server 2012.
У меня была такая же проблема с 1.0.0 RC2, я сделал то, что предлагает Майкл, и это работает. Спасибо.
@MatteKarla: при установке SignalR 1.0.0 RC2 от NuGet в проект добавляются следующие ссылки:
Мне нужно добавить Microsoft.CSharp вручную или после компиляции произойдет следующая ошибка:
У меня были эти 404 ошибки, когда я обновился до Signalr 2.0 и развернул проект MVC на рабочий сервер. Проект публикации с параметром "удалить все существующие файлы до публикации" сохранил мои проблемы.
надеюсь, что это поможет кому-то.
Я тоже сталкивался с этой проблемой в приложении 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>
Возможно, стоит упомянуть: я запускаю приложение Web Forms, которое использует его собственную ручную маршрутизацию. Поскольку запуск OWIN происходит после того, как таблицы маршрутизации были установлены, маршрут для /signalr/hubs никогда не попадал. Я добавил правило, чтобы игнорировать маршруты (IE: пусть веб-формы выполняют маршрутизацию) на любом пути, начинающемся с "/signalr". Это решило мою проблему.
Я решил эту проблему, переключив пул приложений .NET Framework Version с версии 2.0 на v4.0.
может быть из-за того, что ваше имя класса концентратора является "Test", и вы ссылаетесь на "тест" на стороне клиента.
вам не нужен файл signalr/hubs, это просто упрощенная отладка и простой способ вызова функции. см. Посмотрите, что сгенерированный прокси делает для вас, вот и все. Все будет работать без него.
Для меня решение было переустановить все пакеты и восстановить все зависимые.
Откройте команду powershell для nuget и используйте эту команду.
Update-Package -Reinstall
добавление app.MapSignalR();
в класс Startup
устраняет проблему
Ваша проблема в коде сервера. Просто поместите app.UseSignalR()
, прежде чем app.UseSpaStaticFiles()
в Startup.cs
файле