
这是服务器:
namespace Test.SignalRComm.SimpleServer{ using System.Threading.Tasks; using log4net; using SignalR; using SignalR.Hosting.Self; using SignalR.Hubs; using SignalR.Infrastructure; class Program { private static Signalrserver signalrserver = null; static voID Main(string[] args) { signalrserver = new Signalrserver(); signalrserver.Start(); System.Console.Writeline("Press Enter to close..."); System.Console.Readline(); signalrserver.Stop(); } } public class Signalrserver { private string serverUrl = null; public Server signalrserver = null; public Signalrserver() { serverUrl = @"http://localhost:5001/"; signalrserver = new SignalR.Hosting.Self.Server(serverUrl); signalrserver.EnableHubs(); } public voID Start() { signalrserver.Start(); } public voID Stop() { IConnectionManager connManager = signalrserver.DependencyResolver.Resolve<IConnectionManager>(); dynamic clIEnts = connManager.GetClIEnts<SignalRTestHub>(); clIEnts.AddMessage("Test"); signalrserver.Stop(); } } public class SignalRTestHub : Hub,Idisconnect { private static Readonly ILog logger = LogManager.GetLogger(typeof(SignalRTestHub)); public voID Register(string token) { AddToGroup(token).ContinueWith(task => { if (task.IsFaulted) logger.Error(task.Exception.GetBaseException()); else { string message = string.Format("ClIEnt {0} registered with token <{1}>",Context.ConnectionID,token); logger.Info(message); } }); } public voID Unregister(string token) { RemoveFromGroup(token).ContinueWith(task => { if (task.IsFaulted) logger.Error(task.Exception.GetBaseException()); else logger.InfoFormat("ClIEnt {0} unregistered from token <{1}>",token); }); } public Task disconnect() { string message = string.Format("ClIEnt {0} disconnected",Context.ConnectionID); logger.Info(message); return null; } }} 这是客户:
namespace Test.SignalRComm.SimpleClIEnt{ using System.Threading.Tasks; using log4net; using SignalR.ClIEnt.Hubs; class Program { private static Readonly ILog logger = LogManager.GetLogger(typeof(Program)); static voID Main(string[] args) { SignalRClIEnt clIEnt = new SignalRClIEnt("http://localhost:5001/"); clIEnt.Start().ContinueWith(task => { if (task.IsFaulted) { logger.Error("Failed to start!",task.Exception.GetBaseException()); } else { logger.InfoFormat("Success! Connected with clIEnt connection ID {0}",clIEnt.ConnectionID); // Do more stuff here clIEnt.Invoke("Register","Test").ContinueWith(tsk => { if (tsk.IsFaulted) logger.Error("Failed to start!",tsk.Exception.GetBaseException()); else logger.Info("Success! Registered!"); }); } }); System.Console.Writeline("Press Enter to close..."); System.Console.Readline(); clIEnt.Invoke("Unregister","Test").ContinueWith(tsk => { if (tsk.IsFaulted) logger.Error("Failed to stop!",tsk.Exception.GetBaseException()); else logger.InfoFormat("Success! Unregistered!"); }); clIEnt.Stop(); } } public class SignalRClIEnt : HubConnection { private static Readonly ILog logger = LogManager.GetLogger(typeof(SignalRClIEnt)); IHubProxy hub = null; public SignalRClIEnt(string url) : base(url) { hub = CreateProxy("Test.SignalRComm.SimpleServer.SignalRTestHub"); } public Task Invoke(string methodname,params object[] args) { return hub.Invoke(methodname,args); } public voID AddMessage(string data) { logger.InfoFormat("Received {0}!",data); } }} 从客户端(注册和取消注册)调用集线器方法工作正常,我无法从集线器调用客户端AddMessage方法.
此外,当客户端关闭时,永远不会调用集线器的disconnect方法.
我做错了什么?我找不到任何有效的例子.
编辑
订阅客户端上的集线器事件,如下所示:
hub.On<string>("Notify",message => Console.Writeline("Server sent message {0}",message); 并在集线器上触发事件,如下所示:
ClIEnts.Notify("Something to notify"); 使从服务器到客户端的通知工作.
我仍然无法检测到客户端断开连接.我在集线器上实现了Idisconnect接口,但是当客户端连接停止时,不会触发集线器上的disconnect方法.
谢谢你的帮助.
解决方法 在这里看一下如何使用.NET客户端:https://gist.github.com/1324342
和api文档在这里:
https://github.com/SignalR/SignalR/wiki
TL; DR你需要订阅特定的方法,从hubConnection派生不会发生任何魔术.
总结以上是内存溢出为你收集整理的c# – SignalR:我无法从服务器调用.net客户端方法全部内容,希望文章能够帮你解决c# – SignalR:我无法从服务器调用.net客户端方法所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)