我在我的项目中使用SignalR(https://github.com/SignalR/SignalR)。从这里https://github.com/SignalR/SignalR/wiki/QuickStart-Hubs我明白了如何使用Hubs。但“信号器/集线器”脚本给出了404错误。以下是在查看来源中显示的网址:http://localhost:50378/signalr/hubs,提供404错误
这是我的代码: 轮毂:
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 :(得分:44)
如果使用MVC 4,请尝试在Global.asax.cs中的RouteConfig.RegisterRoutes(RouteTable.Routes)之前调用RouteTable.Routes.MapHubs()。它适用于我。
RouteTable.Routes.MapHubs();
RouteConfig.RegisterRoutes(RouteTable.Routes);
答案 1 :(得分:28)
可能是您尚未添加对SignalR.AspNet.dll
的引用。如果我没记错的话,它负责将路线添加到/signalr/hubs
。
答案 2 :(得分:14)
在 SignalR 1.0.0 RC2 中,packages文件夹中有一个README,表示必须手动建立Hubs路由。 :)这是一个片段......
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();
}
}
}
答案 3 :(得分:14)
就我而言,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();
}
}
}
答案 4 :(得分:12)
我也一直在努力解决这个问题,并最终达到导致问题的程度。首先,我不得不说,使用SignalR v2调用Globalasax / Application_Start中的RouteTable.Routes.MapHubs();
已经过时,编译器甚至会发出警告。相反,我们现在使用以下公共方法添加一个专用的StartUp类:
public void Configuration(IAppBuilder app)
{
app.MapSignalR();
}
所有配置都在这里。有关详细信息,请参阅documentation。
现在,在浪费了很多时间谷歌搜索疯狂之后,我决定在前面提到的StartUp类的Configure方法中抛出一个Exception。如果不会抛出任何异常,那么我就会明白Owin甚至没有开始。我的猜测是正确的。出于某种原因,Owin没有开始或有什么东西压制它。在我的情况下,我的web.config文件中的这个恶意配置设置:
<add key="owin:AutomaticAppStartup" value="false" />
我猜设置的名称非常具有描述性。删除此项或将false更改为true。
答案 5 :(得分:4)
你刚刚安装了IIS吗?在这种情况下,您可能必须重新安装它:
c:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i
答案 6 :(得分:3)
您需要使用@Url.Content
引用JavaScript文件,假设您使用的是ASP.NET MVC3
像:
<script src="@Url.Content("~/Scripts/jquery.signalR.min.js")" type="text/javascript"></script>
编辑:正如Trevor De Koekkoek在评论中提到的,如果您使用的是MVC4或更高版本,则无需自己添加@Url.Content
。简单地在uri之前添加~/
就足够了。有关更多信息,请查看this other SO question。
答案 7 :(得分:3)
长话短说:在我的情况下,我使用了R# (ReSharper),右键单击了我使用SignalR并点击了Refactor =&gt;的项目。删除未使用的引用。注意:这是 shoot in the foot 。 :d
它从SignalR
中删除了仅在运行时使用的IMPORTANT DLL引用,也就是说,它们在编译期间不是必需的。显然,R#只检查编译时依赖性。
即缺少这两个参考文献:
SignalR
OWIN配置方法中没有这个断点,甚至不会被击中)。删除了NuGet包,然后重新安装它们。修复了/hubs
404问题。
答案 8 :(得分:3)
使用Visual Studio开发服务器运行代码时遇到同样的问题,当我将项目设置更改为使用IIS本地Web服务器时,它有效。
David Fowler对此问题提出了一个缺陷。该问题将在未来版本中修复,但现在这是解决方法。我目前无法找到该错误的链接。
答案 9 :(得分:2)
这是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>
答案 10 :(得分:1)
当我更新到Signalr 2.0并将MVC项目部署到生产服务器时,我遇到了404错误。使用“在发布之前删除所有现有文件”选项发布项目可以解决我的问题。
希望这有助于某人。
答案 11 :(得分:1)
我的项目是ASP.net 4.0 C#Web App,测试环境是Windows Server 2012。
我对1.0.0 RC2也有同样的问题,我做了Michael建议的并且它有效。感谢。
@MatteKarla:当NuGet安装SignalR 1.0.0 RC2时,以下引用被添加到项目中:
我必须手动添加Microsoft.CSharp,否则在编译期间会出现以下错误:
答案 12 :(得分:1)
或许值得一提:我正在运行使用它自己的手动路由的Web窗体应用程序。由于在设置路由表之后发生OWIN启动,因此从未命中/ signalr / hubs的路由。我添加了一条规则来忽略以&#34; / signalr&#34;开头的任何路径上的路由(IE:让Web表单执行路由)。这解决了我的问题。
答案 13 :(得分:0)
我通过将应用程序池.NET Framework版本从v2.0切换到v4.0来解决了这个问题。
答案 14 :(得分:0)
可能是因为您的中心班级名称是&#39;测试&#39;你指的是测试&#39;在客户端。
答案 15 :(得分:0)
你不需要signalr / hubs文件只是为了更容易调试和直接调用函数的方法。见:See what the generated proxy does for you,就是这样。没有它,事情就会奏效。
答案 16 :(得分:0)
对我而言,解决方案是重新安装所有软件包并恢复所有依赖项。
打开nuget powershell并使用此命令。
Update-Package -Reinstall
答案 17 :(得分:0)
在app.MapSignalR();
课程中添加Startup
可解决问题
答案 18 :(得分:0)
在我的情况下(signalr已添加到现有的大型mvc项目中),原因是未触发OWIN Startup.Configruation()缺少web.config中的“ dependedntAssembly”和错误的“ targetFramwerork”版本。
我从头开始创建了一个简单的signalR项目,并比较了web.config文件。 帮助我们的是:
<httpRuntime targetFramework="4.5" ... >
<compilation debug="true" targetFramework="4.5" ... >
<dependentAssembly>
<assemblyIdentity name="Microsoft.Owin.Security" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
</dependentAssembly>
答案 19 :(得分:0)
我收到该异常是因为我的网址托管错误。我写了“ / chathub”,但在端点中却写了“ / chat”