我正在尝试在我的 MVC4 应用程序中设置 SignalR。
问题是 - 即使当我浏览到路径 /signalr/hubs 我确实看到了代码(并且 fiddler 为 /signalr/hubs 显示 200OK),它似乎不包含对我的集线器和客户端代码的任何引用也没有请参阅集线器和方法。
开始调试时出现这些错误(IIS Express、VS Express 2012):
Global.asax 中的 Application_Start 包含:
//RouteTable.Routes.MapHubs("/signalr", new HubConfiguration());
RouteTable.Routes.MapHubs();
RouteConfig.RegisterRoutes(RouteTable.Routes);
(我假设这会生成 /signalr/hubs,这似乎有效,但没有任何链接到我的实际集线器。可以看出我尝试了这两个选项)。
在我的项目中,我在根目录中使用 MessageHub.cs 获得了文件夹“Hubs”:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Microsoft.AspNet.SignalR;
using Microsoft.AspNet.SignalR.Hubs;
namespace Prj.Hubs
{
[HubName("messagehub")]
public class MessageHub : Hub
{
public void MessageAll(string message)
{
Clients.All.writeMessage(message);
}
public void MessageOthers(string message)
{
Clients.Others.writeMessage(message);
}
public void MessageSingle(string message)
{
}
}
}
在我的 _Layout.cshtml 中,我在结束标记之前:
<script type="text/javascript" src="~/Scripts/jquery-1.9.1.js"></script>
<script type="text/javascript" src="~/Scripts/jquery.signalR-1.1.2.js"></script>
<script src="/signalr/hubs" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function () {
// create proxy on the fly
var proxy = $.connection.messagehub; // this connects to our 'messageHub' Hub as above
// for SignalR to call the client side function we need to declare it with the Hub
proxy.messageAll = function (message) {
$('#messages').append('<li>' + message + ''); // when the Hub calls this function it appends a new li item with the text
};
// declare function to be called when button is clicked
$("#broadcast").click(function () {
// calls method on Hub and pass through text from textbox
proxy.messageAll($("#message").val());
});
// Start the connection
$.connection.hub.start();
});
</script>
(旁注 - SignalR 根本不喜欢 @Scripts.Render("~/bundles/jquery"),但直接包含 jquery 脚本似乎可以工作)。
那么为什么它不能准确识别“messagehub”呢?