我正在将一个非常基本的带有SignalR的“hello world”应用程序放在一起,它有自我托管的小问题,它引入了一两个额外的皱纹。基本上,我试图找出正确的方式从服务器上调用我的客户端上的方法。为SignalR服务器调用客户端的正确语法
在我的客户,比如,我有一个看起来像这样的方法:
roomHub.onEcho = function (msg) {
console.log("onEcho called: " + msg);
};
我可以成功地从我的服务器侧的集线器,像这样称呼它:
public class RoomHub : Hub
{
public void Echo(string echo)
{
Clients.onEcho(echo);
}
}
它的工作原理,但当然,它不仅仅是一个,而是所有10。而各种样品中,我在网上看到(例如,https://github.com/SignalR/SignalR/blob/master/samples/Microsoft.AspNet.SignalR.Hosting.AspNet.Samples/Hubs/Benchmark/HubBench.cs,我看到,使它看起来像我应该能够指定谁被调用,如命令的种种:
public void Echo(string echo)
{
Clients.Caller.onEcho(echo);
Clients.Caller(Context.ConnectionId).onEcho(echo);
Clients.All.onEcho(echo);
}
但我不能得到任何上述语法的工作。对于Clients.All.onEcho()
和Clients.Caller.onEcho()
,绝对没有任何反应。对于Clients.Caller(Context.ConnectionId).onEcho()
,萤火告诉我,它其实是想呼吁我的JavaScript roomHub实例Caller()
方法,这当然是不存在的。
不过这里有点奇怪,如果我看一下Hub类,我可以看到为什么这些工作都不起作用 - 因为Hub的构造函数覆盖了一堆prope它的“客户”对象的rties与NullClientProxies:
protected Hub()
{
Clients = new HubConnectionContext();
Clients.All = new NullClientProxy();
Clients.Others = new NullClientProxy();
Clients.Caller = new NullClientProxy();
}
但我,为什么它是有点儿迷惑 - 为什么样品看起来反正工作 - 或者是什么预期的做法应该是。
有什么想法?我在这里做错了什么?
谢谢,大卫。我在NuGet上看不到的一件事是自托管库。我错过了那些吗?或者我只需要自己构建它们? –
自我托管正在为post 1.0版本进行改进。我们基于OWIN,并不会改进目前的。你可以始终从源代码构建它(这就是为什么我们将它留在那里)。 – davidfowl