50

我在我的项目中使用 SignalR(https://github.com/SignalR/SignalR)。从这里https://github.com/SignalR/SignalR/wiki/QuickStart-Hubs我知道了如何使用集线器。但是“signalr/hubs”脚本给出了 404 错误。这是查看源代码中的 url: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>

网络配置:

  <system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
    <modules runAllManagedModulesForAllRequests="true">
....
4

21 回答 21

44

如果您使用 MVC 4,请尝试在 Global.asax.cs 中的 RouteConfig.RegisterRoutes(RouteTable.Routes) 之前调用 RouteTable.Routes.MapHubs()。它适用于我。

        RouteTable.Routes.MapHubs();
        RouteConfig.RegisterRoutes(RouteTable.Routes);
于 2013-03-15T01:02:38.067 回答
29

可能是您没有添加对SignalR.AspNet.dll. 如果我没记错的话,它负责将路由添加到/signalr/hubs.

于 2012-01-20T14:09:10.257 回答
14

SignalR 1.0.0 RC2开始,packages 文件夹中有一个自述文件,说明必须手动建立集线器路由。:) 这是一个片段......

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();
        }
    }
}
于 2013-01-23T03:24:53.553 回答
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();
        }
    }
}
于 2015-02-12T11:45:14.187 回答
14

我也一直在努力解决这个问题,最终到达了导致问题的地步。首先,我不得不说,RouteTable.Routes.MapHubs();在 Globalasax/Application_Start 内调用 SignalR v2 已经过时,编译器甚至会抛出警告。相反,我们现在使用以下公共方法添加一个专用的 StartUp 类:

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

所有配置都在这里。有关更多信息,请参阅文档

现在,在疯狂地谷歌搜索之后,我决定在前面提到的 StartUp 类的 Configure 方法中抛出一个异常。如果不会抛出异常,那么我会理解 Owin 甚至没有启动。我的猜测是对的。出于某种原因,欧文没有开始,或者有什么东西在压制它。就我而言,这是我的 web.config 文件中的这个邪恶的配置设置:

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

我猜这个设置的名称很有描述性。要么删除它,要么将 false 更改为 true。

于 2016-02-11T12:54:13.840 回答
4

您刚刚安装了 IIS 吗?在这种情况下,您可能需要重新安装它:

c:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i
于 2014-01-08T14:52:20.467 回答
4

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

在此处输入图像描述

对此问题提出了一个缺陷,David Fowler 对此进行了评论。该问题将在未来的版本中得到解决,但现在这是解决方法。我暂时找不到该错误的链接。

于 2012-12-31T18:16:28.833 回答
4

长话短说:就我而言,我使用了R# (ReSharper),右键单击使用 SignalR 的项目,然后单击 Refactor => Remove Unused References。当心:这是脚上的射击。:D

它删除了仅在运行时使用的重要 DLL 引用SignalR,也就是说,它们在编译时不是必需的。显然 R# 只检查编译时依赖。

即缺少这两个参考:

  1. Microsoft.AspNet.SignalR.SystemWeb
  2. Microsoft.Owin.Host.SystemWeb(没有这个,SignalROWIN 配置方法中的断点甚至不会被命中)。

删除 NuGet 包,然后重新安装它们。修复了/hubs404 问题。

于 2014-05-23T16:00:27.470 回答
3

这是来自 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>
于 2014-05-18T15:59:01.297 回答
3

您需要使用 引用 JavaScript 文件@Url.Content,假设您使用的是 ASP.NET MVC3

喜欢:

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

请参阅GitHub 上的 SignalR 常见问题解答

编辑:@Url.Content正如 Trevor De Koekkoek 在他们的评论中提到的,如果您使用 MVC4 或更高版本,则无需添加自己。只需在 uri 前面加上~/就足够了。有关更多信息,请查看其他 SO question

于 2012-01-27T10:32:22.867 回答
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”
于 2013-01-24T11:06:58.230 回答
1

当我更新到 Signalr 2.0 并将 MVC 项目部署到生产服务器时,我遇到了这个 404 错误。使用“在发布前删除所有现有文件”选项发布项目解决了我的问题。

希望这可以帮助某人。

于 2014-01-15T06:46:44.303 回答
1

我也在 ASP.NET 4.0 Web 窗体应用程序上遇到了同样的问题。它适用于开发服务器,但不适用于生产环境。确保所有请求/模块在托管模式下运行的解决方案对我们来说是不可接受的。

我们采用的解决方案(更适合 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 e.g. FormsAuthentication, Roles etc. -->
</modules>
于 2015-11-23T23:04:20.473 回答
1

也许值得一提:我正在运行一个使用它自己的手动路由的 Web 窗体应用程序。由于 OWIN 启动是在设置路由表之后发生的,因此 /signalr/hubs 的路由从未被命中。我添加了一条规则以忽略以“/signalr”开头的任何路径上的路由(IE:让 Web 表单执行路由)。这解决了我的问题。

于 2016-05-19T18:49:10.957 回答
0

我得到了那个例外,因为我的 url 托管是错误的。我写了“/chathub”,但在我的端点上写着“/chat”

于 2020-07-21T21:26:59.813 回答
0

加入课堂解决了这个app.MapSignalR();问题Startup

于 2017-06-23T06:18:45.727 回答
0

可能是因为您的集线器类名称是“测试”,而您在客户端指的是“测试”。

于 2016-07-29T12:37:57.353 回答
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>
于 2019-12-09T14:37:02.550 回答
0

对我来说,解决方案是重新安装所有软件包并恢复所有依赖项。

打开 nuget powershell 并使用此命令。

Update-Package -Reinstall
于 2017-05-27T09:46:54.647 回答
0

我通过将应用程序池 .NET Framework 版本从 v2.0 切换到 v4.0 解决了这个问题。

于 2016-03-02T08:31:15.380 回答
0

您不需要 signalr/hubs 文件,它只是为了更容易调试和调用函数的直接方式。查看:查看生成的代理为您做了什么,仅此而已。没有它,一切都会好起来的。

于 2016-10-07T06:14:19.877 回答