c# – SignalR:我无法从服务器调用.net客户端方法

c# – SignalR:我无法从服务器调用.net客户端方法,第1张

概述我想用.NET客户端实现一个pub / sub应用程序,所以我通过这个最小的代码测试SignalR. 这是服务器: namespace Test.SignalRComm.SimpleServer{ using System.Threading.Tasks; using log4net; using SignalR; using SignalR.Hosting.Se 我想用.NET客户端实现一个pub / sub应用程序,所以我通过这个最小的代码测试SignalR.

这是服务器:

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客户端方法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1234489.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存