私はSignalRを使用して、非常に基本的な種類の「Hello World」アプリをまとめていますが、自己ホスト型であるという小さな注意点があり、追加のしわが1つか2つ発生します。基本的に、私はサーバーからクライアントのメソッドを呼び出す正しい方法を見つけようとしています。
たとえば、私のクライアントには、次のようなメソッドがあります。
roomHub.onEcho = function (msg) {
console.log("onEcho called: " + msg);
};
そして、次のようにサーバー側のハブから正常に呼び出すことができます。
public class RoomHub : Hub
{
public void Echo(string echo)
{
Clients.onEcho(echo);
}
}
そしてそれは機能しますが、もちろん、 1つだけでなくすべてのクライアントを呼び出します。そして、私がオンラインで見たさまざまなサンプル(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()
、Firebugは、JavaScriptのroomHubインスタンスでメソッドを実際に呼び出そうとしていると言っていCaller()
ますが、もちろんそこにはありません。
ただし、ここに奇妙な点があります。Hubクラスを見ると、これらのいずれも機能しない理由がわかります。Hubコンストラクターは、その「Clients」オブジェクトのプロパティの束をNullClientProxiesでオーバーライドするためです。
protected Hub()
{
Clients = new HubConnectionContext();
Clients.All = new NullClientProxy();
Clients.Others = new NullClientProxy();
Clients.Caller = new NullClientProxy();
}
しかし、なぜそれが行われるのか、またはサンプルがとにかく機能するように見えるのか、または期待されるアプローチがどうあるべきかについて、私はちょっと不思議に思っています。
何かご意見は?私はここで何が間違っているのですか?