15

这就是我所做的。

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

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

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

  1. MVC项目
    • 领域
      • 子文件夹
        • 控制器
          • SignalRTestController.cs
        • 模型
        • 看法
          • 索引.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

脚本类型="text/javascript" src="/signalr/hubs" />

我认为控制器很好,但我没有得到 /signalr/hubs。它抛出 404 并且 Chrome 控制台中的消息是这样的:

资源解释为脚本,但使用 MIME 类型 text/html 传输:“http://www.myproject.com/signalr/hubs”。未捕获的语法错误:意外的令牌 < 集线器:2 未捕获的 SignalR:加载集线器时出错。确保您的集线器引用正确,例如脚本 src='/signalr/hubs'>。

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

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

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

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

4

7 回答 7

32

你有调用 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") 解决了这个问题。

于 2012-12-07T16:21:23.350 回答
5

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...
        }
    }
}
于 2015-11-14T20:45:39.097 回答
2

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

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

Install-Package Microsoft.AspNet.SignalR -pre

它还添加了一些参考:

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

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

于 2012-12-01T23:28:35.210 回答
1

你的参考有问题。请执行下列操作:

  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 集线器,如下所示:

/信号器/集线器

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

于 2012-11-13T09:16:45.883 回答
0

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

于 2015-03-23T02:45:36.880 回答
0

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

于 2012-10-02T20:30:29.790 回答
0

就我而言,我必须删除 web.config appSettings 中的一个键:

<add key="owin:AutomaticAppStartup" value="false" />
于 2017-02-02T18:57:33.007 回答