Самостоятельно размещенные методы SignalR IHubContext, не вызывающие клиент (клиент консоли .Net) - PullRequest
0 голосов
/ 15 октября 2019

У меня есть собственный сервер SignalR, использующий Owin и SignalR.SelfHost в консольном приложении, также есть (консольный проект .Net) клиент (использующий пакет NuGet SignalR.Client), после того как сервер размещен, я могу установить соединение склиент, я вижу один и тот же идентификатор соединения на стороне клиента и HubCallerContext.ConnectionId в Hub в методе OnConnected. Но когда я пытаюсь вызвать метод «ReceiveMessage» на клиенте, используя «GlobalHost.ConnectionManager.GetHubContext» и «Context.Clients.All.InvokeAsync (« ReceiveMessage »)», он не достигает клиента (также не исключение)). Я хочу, чтобы это соединение было одним из способов на данный момент, то есть с сервера на клиент (только push-уведомления с сервера). И сервер, и клиент находятся в .net Framework (не .Net Core). Идентификатор соединения, который я вижу в Global HubContext, отличается от идентификатора соединения с клиентом.

1) Код на стороне сервера,

public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.UseCors(CorsOptions.AllowAll);           
            app.MapSignalR();           
        }
    }

public static MonitoringContext _monitoringContext;
        static void Main(string[] args)
        {
            // Start OWIN host 
            using (WebApp.Start<Startup>("http://localhost:49632/"))
            {
                Console.WriteLine("Server running on {0}", "http://localhost:49632/");
                _monitoringContext = new MonitoringContext();
                RunLoop();
                //SetTimer();
                Console.ReadLine();
            }
        }
        private static void RunLoop()
        {
            do
            {
                Thread.Sleep(5000);
                _monitoringContext.CallHubClients();

            } while (true);

        }

public class MonitoringContext
    {
        IHubContext _hubContext;
        public MonitoringContext()
        {
            _hubContext = GlobalHost.ConnectionManager.GetHubContext<MonitoringHub>();
        }

        public void CallHubClients()
        {
            Console.WriteLine("Calling client with ID....");
             _hubContext.Clients.All.InvokeAsync("ReceiveMessage");

        }
    }

[HubName("MonitoringHub")]
    public class MonitoringHub : Hub
    {        
        public override Task OnConnected()
        {
            Console.WriteLine("Client connected...." + this.Context.ConnectionId);            
            return base.OnConnected();
        }

        public override Task OnReconnected()
        {
            return base.OnReconnected();
        }

        public override Task OnDisconnected(bool stopCalled)
        {
            Console.WriteLine("Client disconnected....");
            return base.OnDisconnected(stopCalled);
        }

    }

2) Код на стороне клиента -

static HubConnection connection;
        static IHubProxy _hubProxy;
        static Action OnReceivedAction;

        public async void RegisterClient()
        {           
            OnReceivedAction = ReceiveMessage;

            connection = new HubConnection("http://localhost:49632/");
            _hubProxy = connection.CreateHubProxy("MonitoringHub");
            _hubProxy.On("ReceiveMessage", OnReceivedAction);
            await connection.Start();

            Console.WriteLine("Hub connection started with ID...." + connection.ConnectionId );
        }

        public void ReceiveMessage()
        {
            Console.WriteLine("Message Received....Hurrey!!");           
        }

1 Ответ

0 голосов
/ 16 октября 2019

Получил решение, когда я запустил Trace на стороне клиента, я вызывал неправильный метод «InvokeAsync», это было имя метода, которое на стороне клиента искало SignalR, когда я непосредственно вызывал ´ «ReceiveMessage», затем оно было решенок правильному методу на стороне клиента.

_hubContext.Clients.All.ReceiveMessage ("Reached ...");

Во многих ответах на stackoverflow и других местах это следующееупоминается как вызов клиентских методов, но у меня это не сработало.

_hubContext.Clients.Group ("Test"). InvokeAsync ("ReceiveMessage")

...