我正在尝试 SignalR。
我开始使用一种方法制作集线器Echo
。集线器在连接时以及从 Echo 方法调用客户端上“回显”的方法。客户端会看到在 OnConnected 中发生的对“回声”的第一次调用,但看不到它调用自己的来自 Echo 的调用。我怀疑原因是在服务器上,集线器在两个不同的应用程序域中实例化了两个调用。
--- 更新: --- 通过在 IIS 管理器中(在应用程序池/我的应用程序池/高级设置下)将“最大工作进程”设置为 1,应用程序被强制在单个 AppDomain 中,并且回调回显有效。有没有办法让它与多个工作进程一起工作?
public override System.Threading.Tasks.Task OnConnected()
{
Log.WriteLine("SIGNALR CONNECTED: " + Context.ConnectionId);
Clients.All.Echoed("now connected: "+Context.ConnectionId);
return base.OnConnected();
}
public void Echo(string data)
{
Log.WriteLine("SIGNALR ECHO: " + data);
Clients.All.Echoed(data);
}
客户端是 .NET(Xamarin),它尝试向自己发送一条回显消息:
try{
System.Net.ServicePointManager.DefaultConnectionLimit = 10;
HubConnection hubConnect = new HubConnection ("http://localhost:1234/signalr");
hubConnect.Closed+=()=> Console.WriteLine("CLOSED");
hubConnect.Error+=(e)=>Console.WriteLine("ERROR: "+e);
hubConnect.Received+=(s)=>Console.WriteLine("RECEIVED: "+s);
hubConnect.Reconnected+=()=>Console.WriteLine("Reconnected");
IHubProxy ordersHubProxy = hubConnect.CreateHubProxy ("OrdersHub");
ordersHubProxy.On<string> ("Echoed", (echo) =>{
Console.WriteLine ("ECHOED: " + echo );
});
hubConnect.Start().Wait();
Console.WriteLine("CONNECTED: "+hubConnect.Transport.Name);
ordersHubProxy.Invoke("echo", "callback");
} catch (Exception x){
Console.WriteLine ("Unable to connect to SignalR: " + x);
};
在客户端,我看到一个带有“现在连接:xyzguid”消息的“回显”事件,但我没有看到“回调”消息。在服务器端,连接和回声都有记录的事件,但回声没有到达要求它的客户端:
服务器日志:
LOG AppDomain: /LM/W3SVC/2/ROOT/MyApp-11-130157367321605301 Thread: 35
SIGNALR CONNECTED: 8ab4ef99-a41a-4e33-9aba-086a80e2e4a2
LOG AppDomain: /LM/W3SVC/2/ROOT/MyApp-11-130157367360449370 Thread: 1
SIGNALR ECHO: callback
客户端日志:
CONNECTED: serverSentEvents
ECHOED: now connected: 5cde92f8-9719-4963-b64f-a8bbe39a72ac
RECEIVED: {
"H": "MyHub",
"M": "Echoed",
"A": [
"now connected: 5cde92f8-9719-4963-b64f-a8bbe39a72ac"
]
我也希望看到这个,但它没有出现:
ECHOED: callback
RECEIVED: ...