这就是我所做的。
- 我使用 nuget 为我的 MVC4 项目获取 SignalR。
- 在我的控制器中创建了一个 MyHub 类(SignalRTestController.cs)
- 在索引操作中,尝试从集线器外部广播消息并返回视图。
- 在视图中,引用了所有脚本和 /signalr/hubs。
问题是找不到 /signalr/hubs(抛出 404)。
我的项目有区域,结构如下所示:
- 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 不使用属性路由。