SignalR“signalr / hubs”给404错误
我在我的项目中使用SignalR(https://github.com/SignalR/SignalR)。 从这里https://github.com/SignalR/SignalR/wiki/QuickStart-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"> ....
这可能是因为你没有添加对SignalR.AspNet.dll
的引用。 如果我记得正确,它负责将路由添加到/signalr/hubs
。
如果您使用MVC 4,请尝试在Global.asax.cs中的RouteConfig.RegisterRoutes(RouteTable.Routes)之前调用RouteTable.Routes.MapHubs()。它适用于我。
RouteTable.Routes.MapHubs(); RouteConfig.RegisterRoutes(RouteTable.Routes);
从SignalR 1.0.0 RC2的包文件夹中有一个自述文件,说明集线器路由必须手动build立。 :)这是一个片段…
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();
现在已经过时了。 对于映射集线器,您可以创build一个启动类如下。
[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(); }
所有configuration都在这里。请参阅文档了解更多信息。
现在,在浪费了许多小时之后,我疯狂地search了一些东西,于是决定在前面提到的StartUp类的Configure方法中抛出Exception。 如果不会抛出exception的话,我会明白的是,欧文甚至没有开始。 我的猜测是对的。 出于某种原因,Owin没有开始,或者有什么东西在压制它。 在我的情况下,这是我的web.config文件中这个邪恶的configuration设置:
<add key="owin:AutomaticAppStartup" value="false" />
我猜这个设置的名字是非常具有描述性的。 要么删除这个或将false更改为true。
你刚才安装的IIS? 在这种情况下,您可能需要重新安装它:
c:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i
使用Visual Studio开发服务器运行我的代码时,我遇到了同样的问题,当我将项目设置更改为使用IIS本地Web服务器时,该问题就起作用了。
大卫·福勒评论过这个问题。 问题将在未来的版本中得到解决,但现在这是解决方法。 目前我无法find错误的链接。
您需要使用@Url.Content
引用JavaScript文件,假设您使用的是ASP.NET MVC3
喜欢:
<script src="@Url.Content("~/Scripts/jquery.signalR.min.js")" type="text/javascript"></script>
请参阅GitHub上的SignalR FAQ
编辑: Trevor De Koekkoek在他们的评论中提到,如果你使用MVC4或更高版本,你不需要自己添加@Url.Content
。 简单地在~/
足够的前面加上uri。 有关更多信息,请查看其他SO问题 。
这是来自SignalR wiki的完整答案( https://github.com/SignalR/SignalR/wiki/Faq )。 它与我合作:
首先,请确保您在Global.asax中调用了MapHubs()。
请确保Hub路由在应用程序中的任何其他路由之前注册。
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>
我的项目是ASP.net 4.0 C#Web App,testing环境是Windows Server 2012。
我有1.0.0 RC2的同样的问题,我做了迈克尔build议,它的工作原理。 谢谢。
@MatteKarla:当通过NuGet安装SignalR 1.0.0 RC2时,以下参考被添加到项目中:
- Microsoft.AspNet.SignalR.Core
- Microsoft.AspNet.SignalR.Owin
- Microsoft.AspNet.SignalR.SystemWeb
- Microsoft.Owin.Host.SystemWeb
我必须手动添加Microsoft.CSharp或在编译过程中会发生以下错误:
- 预定义types“Microsoft.CSharp.RuntimeBinder.Binder”未定义或导入
当我更新到Signalr 2.0并将MVC项目部署到生产服务器时,我遇到了这个404错误。 使用“发布之前删除所有现有文件”选项发布项目保存了我的问题。
希望这可以帮助别人。
我也遇到了ASP.NET 4.0 Web窗体应用程序中的这个相同的问题。 它在开发服务器上工作,但不在生产环境中工作。 确保所有请求/模块以托pipe模式运行的解决scheme对我们来说是不可接受的。
我们去的解决scheme(更好的ASP.NET Web窗体)如下。 将以下部分添加到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 eg FormsAuthentication, Roles etc. --> </modules>
也许值得一提的是:我正在运行一个使用自己的手动路由的Web窗体应用程序。 由于OWIN启动发生在路由表设置之后,/ signalr / hubs的路由从未被命中。 我在任何以“/ signalr”开头的path中添加了一个规则来忽略路由(IE:让web表单执行路由)。 这解决了我的问题。
长话短说:在我的情况下,我使用R#(ReSharper) ,右键单击我使用SignalR的项目,然后单击重构=>删除未使用的引用。 小心:这是一个在脚下拍摄 。 :d
它删除了仅在运行时使用的来自SignalR
重要DLL引用, SignalR
,在编译期间它们不是必需的。 显然R#只检查编译时间依赖性。
即这两个参考文献丢失了:
- Microsoft.AspNet.SignalR.SystemWeb
- Microsoft.Owin.Host.SystemWeb(没有这个在
SignalR
OWINconfiguration方法中的断点将不会被击中)。
删除了NuGet包,然后重新安装它们。 修复了/hubs
404的问题。
我通过将应用程序池.NET Framework Version从v2.0切换到v4.0来解决此问题。
可能是因为您的集线器类名称是“testing”,而您指的是客户端的“testing”。
你不需要信号/集线器文件,它只是为了更简单的debugging和直接的方式来调用一个函数。 看看: 看看生成的代理为你做了什么 ,就是这样。 没有它,事情就会起作用。
对我来说,解决scheme是重新安装所有的软件包并恢复所有的依赖。
打开nuget powershell并使用这个命令。
Update-Package -Reinstall
添加app.MapSignalR();
在Startup
类中解决了这个问题