SignalR“signalr / hubs”给出404错误

时间:2012-01-20 12:37:26

标签: c# asp.net signalr

我在我的项目中使用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">
....

20 个答案:

答案 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>

请参阅SignalR FAQ on GitHub

编辑:正如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#只检查编译时依赖性。

即缺少这两个参考文献:

  1. Microsoft.AspNet.SignalR.SystemWeb
  2. Microsoft.Owin.Host.SystemWeb(在SignalR OWIN配置方法中没有这个断点,甚至不会被击中)。
  3. 删除了NuGet包,然后重新安装它们。修复了/hubs 404问题。

答案 8 :(得分:3)

使用Visual Studio开发服务器运行代码时遇到同样的问题,当我将项目设置更改为使用IIS本地Web服务器时,它有效。

enter image description here

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.AspNet.SignalR.Core
  • Microsoft.AspNet.SignalR.Owin
  • Microsoft.AspNet.SignalR.SystemWeb
  • Microsoft.Owin.Host.SystemWeb

我必须手动添加Microsoft.CSharp,否则在编译期间会出现以下错误:

  • 未定义或导入预定义类型“Microsoft.CSharp.RuntimeBinder.Binder”

答案 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文件。 帮助我们的是:

  1. 校正从4.5到4.5.2英寸
    <httpRuntime targetFramework="4.5" ... > 
    <compilation debug="true" targetFramework="4.5" ... >
  1. 添加依赖程序集:
<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”