2012-01-20 5 views
43

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

Вы, используя источники или пакет? Я рекомендую использовать пакет, поскольку источники на данный момент не полностью стабильны. – davidfowl

+2

Кроме того, какой веб-сервер вы используете? – davidfowl

ответ

26

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

+3

Была ли эта сборка/библиотека переименована в SignalR.Hosting.AspNet.dll? Я использовал пакет Nuget, и я не вижу ни одного источника с именем SignalR.AspNet.dll –

+5

Я думаю, теперь я сейчас Microsoft.AspNet.SignalR.SystemWeb.dll –

+0

@ AndréPena yep ... здесь http: // www .nuget.org/packages/Microsoft.AspNet.SignalR.SystemWeb/Я удалил неиспользуемые 'DLL' из проекта, используя RSharper, чтобы найти, что эта DLL используется только во время выполнения. Ой! –

3

Вы должны ссылаться на файл JavaScript с @Url.Content, предполагая ou're с помощью ASP.NET MVC3

как:

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

Смотрите SignalR FAQ on GitHub

Edit: Тревор De Koekkoek, упомянутый в их комментарии, вам не нужно добавлять @Url.Content самостоятельно, если вы используете MVC4 или более позднюю версию. Достаточно добавить uri с ~/. Для получения дополнительной информации посетите this other SO question.

+1

Это относится только к MVC3 или ранее. Url.Content автоматически с «~ /» в MVC4 и позже. –

3

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

enter image description here

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

14

От 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(); 
     } 
    } 
} 
+0

это устарело и не нужно - см. Http://www.asp.net/signalr/overview/releases/upgrading-signalr-1x-projects-to-20 –

1

Мой проект ASP.net # Web App, тестирование среды +4,0 C является 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' не определен или импортированные
43

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

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

Я нашел ресурсы, которые говорят, добавив RouteConfig, WebApiConfig, и реестры FilterConfig могут помочь, но я не могу найти ресурс, чтобы добавить ссылку на любую из них. Какую ссылку я должен включить, чтобы включить их? – BTC

+0

Да, это исправлено для меня. Спасибо –

+0

Почему 'MapHubs()' нужно вызывать * перед * 'RegisterRoutes()'? – Despertar

4

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

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

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

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

2

Это полный ответ из вики-страницы 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 type="text/javascript" src="@Url.Content("~/signalr/hubs")"></script> 

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

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

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

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

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

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

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

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

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

12

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

Я тоже сталкивался с этой проблемой в приложении 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> 
+0

- единственный ответ, который разрешил мою проблему 404. Спасибо –

11

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

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

Всех конфигурации идут here.See documentation для получения дополнительной информации.

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

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

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

+0

Этот меня просто укусил. Я, должно быть, добавил настройку несколько лет назад, играя с SignalR и полностью забыл об этих настройках. Благодаря! –

+0

Изменения в файле web.config сделали это! Отработанные часы волос, тянущие это, меняя вещи здесь, меняясь там. – DaveN

+0

Для меня это было Тот же результат, добавленный app.MapSignalR(); к IdentityConfig, и все сработало. –

0

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

1

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

0

может быть связано с тем, что ваше имя класса концентратора является «Test», и вы имеете в виду «тест» на стороне клиента.

0

Вам не нужен файл signalr/hubs, это просто упрощает отладку и простой способ вызова функции. смотреть: See what the generated proxy does for you, это все. Все будет работать без него.

0

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

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

Update-Package -Reinstall 
0

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

Смежные вопросы