【问题标题】:/signalr/hubs not loading in asp.net mvc4: Throws 404/signalr/hubs 未在 asp.net mvc4 中加载:抛出 404
【发布时间】:2017-02-03 02:57:33
【问题描述】:

这就是我所做的。

  1. 我使用 nuget 为我的 MVC4 项目获取 SignalR。
  2. 在我的控制器中创建了一个 MyHub 类 (SignalRTestController.cs)
  3. 在索引操作中,尝试从集线器外部广播消息并返回视图。
  4. 在视图中,引用了所有脚本和 /signalr/hubs。

问题是找不到 /signalr/hubs(抛出 404)。

我的项目有区域,结构如图所示:

  1. MVC项目
    • 区域
      • 子文件夹
        • 控制器
          • SignalRTestController.cs
        • 型号
        • 查看
          • Index.cshtml
    • 控制器
    • 型号
    • 查看
    • 脚本

signalR 的所有脚本都在 Scripts 文件夹中,我的 SignalRTestController.cs 如下所示:

namespace SignalRTest.Controllers
{
public class SignalRTestController : Controller
{
    public ActionResult Index()
    {
        // Do some work here

        // Broadcasting over a Hub from outside of a Hub
        var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
        context.Clients.say("Hello SignalR!");

       return View();
    }
}

[HubName("MyHub")]
public class MyHub : Hub
{
    public void Say(string message)
    {
        Clients.sendMessage(message);
    }
}
}

我的任何 Index.cshtml 都引用了所有 javascripts 和 /signalr/hubs,如下所示: // 其他 Javascripts

script type="text/javascript" src="/signalr/hubs" />

我认为控制器没问题,但我没有收到 /signalr/hubs。它正在抛出 404,Chrome 控制台中的消息是这样的:

资源解释为脚本,但使用 MIME 类型 text/html 传输:“http://www.myproject.com/signalr/hubs”。 Uncaught SyntaxError: Unexpected token .

脚本返回为 html 的原因是服务器返回 404 not found。

我不确定出了什么问题。我认为这可能是一个路由问题。我不确定,如果我们需要在项目中为 /signalr/hubs 添加任何路由信息,或者我在这里遗漏了什么。

仅供参考:当我创建一个新的空 MVC 项目并添加 signalR 并开始处理它时,它工作得非常好。无需添加路由。

另外,我在某些地方同时使用默认路由和属性路由。但是控制器 SignalRTestController 不使用属性路由。

【问题讨论】:

  • 你解决过这个问题吗?
  • 目前还没有。我们已经从这个 sprint 中删除了这个任务。我能够在测试项目中使用 signalR,但不能在实际项目中使用。必须再次经历这个并做一个详细的研究。对不起:(
  • 你有调用 RouteTable.Routes.MapHubs()(可能在 Global.asax 中)吗?如果是这样,请尝试摆脱它,看看它是否能解决您的问题。
  • 我一直在玩它。看来在当前版本中(我得到了最新的源代码,因为我需要一个签名的程序集),你必须调用 RouteTable.Routes.MapHubs()。但要使其工作,必须首先调用它(或至少在 RouteConfig.RegisterRoutes() 调用之前)。如果在此之后调用它,MVC 会为其寻找控制器,但这是行不通的。在我使用的通过 nuGet 获得的早期版本中,删除 RouteTable.Routes.MapHubs() 可以解决问题,但现在似乎是必需的。希望对您有所帮助。
  • 我一指定 RouteTable.Routes.MapHubs("~/signalr"),它就开始工作了。我认为这是一个问题。 @Pete您能否将您的评论添加为aswer,以便我将其标记为正确并关闭它。这是我所做的,我使用 Install-Package Microsoft.AspNet.SignalR -pre 安装了最新的信号器,并将 RouteTable.Routes.MapHubs("~/signalr") 添加到 Global.aspx 中的 Application_Start。

标签: asp.net-mvc-4 http-status-code-404 signalr signalr-hub


【解决方案1】:

您是否调用过 RouteTable.Routes.MapHubs()(可能在 Global.asax 中)?如果是这样,请尝试摆脱它并查看它是否可以解决您的问题。 – 皮特 11 月 16 日 17:22

我一直在玩它。看来在当前版本中(我得到了最新的源代码,因为我需要一个签名的程序集),你必须调用 RouteTable.Routes.MapHubs()。但要使其工作,必须首先调用它(或至少在 RouteConfig.RegisterRoutes() 调用之前)。如果在此之后调用它,MVC 会为其寻找控制器,但这是行不通的。在我使用的通过 nuGet 获得的早期版本中,删除 RouteTable.Routes.MapHubs() 可以解决问题,但现在似乎是必需的。希望这会有所帮助。 - 皮特 11 月 27 日 20:53


显然您通过将 RouteTable.Routes.MapHubs() 更改为: RouteTable.Routes.MapHubs("~/signalr")。

【讨论】:

  • 太好了,非常感谢,我已经尝试解决 404 几个小时了,在我将 RouteTable.Routes.MapHubs() 放在默认 MVC RouteConfig.RegisterRoutes(RouteTable.Routes) 之前,它成功了!
【解决方案2】:

MapHubs 现已过时。在 Owin 启动类中使用 MapSignalR 扩展方法,如下所示:

[assembly: OwinStartupAttribute(typeof(signalr_test.Startup))]
namespace signalr_test
{
    public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            ConfigureAuth(app);
            app.MapSignalR(); //can take path also see overloads...
        }
    }
}

【讨论】:

    【解决方案3】:

    我遇到了同样的问题。这是修复:

    Nuget 没有添加所有必要的引用。我重新运行了这个命令:

    Install-Package Microsoft.AspNet.SignalR -pre
    

    并添加了更多参考:

    • Microsoft.AspNet.SignalR.Hosting.Aspnet
    • Microsoft.AspNet.SignalR.Hosting.Common

    一旦完成,它就像一个冠军!

    【讨论】:

    • 我也试过了。我注意到他们改变了我们在服务器和客户端之间发送消息的方式。我不确定我的项目有什么问题。我仍然得到 404。当我尝试在一个新的空项目上构建一个聊天应用程序时,它工作得非常好.. :(
    【解决方案4】:

    您的参考有问题。执行以下操作:

    1. 在你的 AppStart/Bundle.Config.cs 添加这个:

      bundles.Add(new ScriptBundle("~/bundles/signalR").Include(
          "~/Scripts/jquery.signalR-{version}.js"));
      
    2. 在 layout.cshtml 中添加:

      @Scripts.Render("~/bundles/signalR")

    3. 在您使用 signalR 的页面上,确保您引用 signalR 集线器,如下所示:

    /signalr/集线器

    就像在这个页面上完成的那样: http://blog.devscrum.net/2011/12/getting-started-with-signalr-in-asp-net-mvc/ (上面写着:“在 index.cshtml 中添加以下代码”)

    【讨论】:

    • 我正在按照您刚才描述的方式进行操作。如果我创建一个新项目并且它不适用于现有项目,它会起作用。我不确定,这是怎么回事..
    【解决方案5】:

    尝试将 [HubName("MyHub")] 更改为 [HubName("myHub")] 并确保在 javascript 中创建代理的任何位置进行更新。过去它对我有用。

    【讨论】:

      【解决方案6】:

      就我而言,我不小心在不同位置创建了两个同名的 Hub 类(两个派生自 Hub 的类)。我删除了一个,一切正常。

      【讨论】:

        【解决方案7】:

        在我的例子中,我必须删除 web.config appSettings 中的一个键:

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

        【讨论】:

          猜你喜欢
          • 2012-06-24
          • 1970-01-01
          • 2012-10-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-04
          相关资源
          最近更新 更多