好的,Ryu 提供的解决方案是正确的 - 但可能会让许多人感到困惑。老实说,我还没有找到一个演练(使用与示例完全相同的代码)——但没有任何效果,部分原因是随着信号器项目的推进,很多东西都变得过时了。
所以,你有一个扩展 PersistentConnection 的类,在这个类中你有所有的任务(OnConnected、OnReceived 等):
using System.Threading.Tasks;
using Microsoft.AspNet.SignalR;
public class MyAwesomeConnection : PersistentConnection
{
protected override Task OnConnected(IRequest request, string connectionId)
{
var fromClient = request.QueryString["testQuery"];
return base.OnConnected(request, connectionId);
}
protected override Task OnReceived(IRequest request, string connectionId, string data)
{
return base.OnReceived(request, connectionId, data);
}
}
然后您在 OwinStartup 类中“映射”该类(在本例中为 MyAwesomeConnection):
using DataCommunication;
using Microsoft.Owin;
using Owin;
[assembly: OwinStartup(typeof(SignalRServer.Startup))]
namespace SignalRServer
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.MapSignalR<MyAwesomeConnection>("/server");
}
}
}
现在您可以使用 javascript 进行连接,并且在引用 jquery 和 jquery.signalR 脚本时要非常小心。首先是 jquery,其次是 jquery.signalR,然后是所有其他使用 signalR 的脚本并避免使用 @Scripts.Render("bundles/jquery")。用老式的方式来做吧:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width" />
<title>@ViewBag.Title</title>
<script type="text/javascript" src="Scripts/jquery-1.10.2.min.js"></script>
<script type="text/javascript" src="Scripts/jquery.signalR-2.1.1.min.js"></script>
@Styles.Render("~/Content/css")
@Scripts.Render("~/bundles/modernizr")
</head>
<body>
<script>
var connection = $.connection("/server", "testQuery=This crap finally works", true);
connection.start();
</script>
@RenderBody()
@Scripts.Render("~/bundles/bootstrap")
@RenderSection("scripts", required: false)
</body>
</html>
在 MyAwesomeConnection 类的 OnConnected 中的某处设置断点,并读出变量 fromClient,一旦客户端 (javascript) 连接就会触发该变量。它应该有希望读出“这个废话终于起作用了”。
现在您应该很高兴使用 signalR 构建一些壮观的东西,如果仍然无法正常工作 - 那么您要么缺少 nuget 中的一些程序集,要么在项目中未正确设置引用。