SignalR: как вызвать клиентский метод .Net с сервера?

Я хочу отправить данные в свое консольное приложение, которое подключено к моему "someHub". Я попытался сделать так, как описано в примере по ссылке, но безрезультатно. Код на стороне сервера:

[HubName("somehub")]
public class SomeHub : Hub
{
    public override Task OnConnected()
    {
        //Here I want to send "hello" on my sonsole application
        Clients.Caller.sendSomeData("hello");

        return base.OnConnected();
    }
}

Код стороны клиента:

public class Provider
{
    protected HubConnection Connection;
    private IHubProxy _someHub;

    public Provider()
    {
        Connection = new HubConnection("http://localhost:4702/");
        _someHub = Connection.CreateHubProxy("somehub");
        Init();
    }

    private void Init()
    {
        _someHub.On<string>("sendSomeData", s =>
        {
            //This code is not reachable
            Console.WriteLine("Some data from server({0})", s);
        });

        Connection.Start().Wait();
    }
}

Какое лучшее решение для реализации этого и по какой причине я не могу вызвать клиентский метод?


person Denis    schedule 14.04.2013    source источник
comment
Вы звонили в MapHubs?   -  person halter73    schedule 15.04.2013
comment
Да, я сделал. Вызовы от клиента к серверу работают нормально, например: myHub.Invoke‹string›(GetValue).ContinueWith(task =› Console.WriteLine(Value from server {0}, task.Result)); , а вот с сервера на клиент - нет   -  person Denis    schedule 15.04.2013
comment
Возможный дубликат SignalR + отправка сообщения в Хаб через метод действия   -  person Liam    schedule 21.04.2017


Ответы (1)


Вы пытаетесь поговорить с клиентами за пределами Hub? Если да, то вам нужно будет получить HubContext за пределами Hub. И тогда вы можете поговорить со всеми клиентами.

IHubContext context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();

Сервер SignalR с использованием собственного хоста Owin

class Program
    {
        static void Main(string[] args)
        {
            string url = "http://localhost:8081/";

            using (WebApplication.Start<Startup>(url))
            {
                Console.WriteLine("Server running on {0}", url);
                Console.ReadLine();
                IHubContext context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
                for (int i = 0; i < 100; i++)
                {
                    System.Threading.Thread.Sleep(3000);
                    context.Clients.All.addMessage("Current integer value : " + i.ToString());
                }
                Console.ReadLine();
            }

        }
    }
    class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            // Turn cross domain on 
            var config = new HubConfiguration { EnableCrossDomain = true };
            config.EnableJavaScriptProxies = true;

            // This will map out to http://localhost:8081/signalr by default
            app.MapHubs(config);
        }
    }
    [HubName("MyHub")]
    public class MyHub : Hub
    {
        public void Chatter(string message)
        {
            Clients.All.addMessage(message);
        }
    }

Приложение Signalr Client Console, использующее концентраторы Signalr.

class Program
    {
        static void Main(string[] args)
        {  
            var connection = new HubConnection("http://localhost:8081/");

            var myHub = connection.CreateHubProxy("MyHub");

            connection.Start().Wait();
            // Static type
            myHub.On<string>("addMessage", myString =>
            {
                Console.WriteLine("This is client getting messages from server :{0}", myString);
            });


            myHub.Invoke("Chatter",System.DateTime.Now.ToString()).Wait();


            Console.Read();
        }
    }

Чтобы запустить этот код, создайте два отдельных приложения, затем сначала запустите серверное приложение, а затем клиентское консольное приложение, затем просто нажмите клавишу на серверной консоли, и он начнет отправлять сообщения клиенту.

person Mitul    schedule 15.04.2013
comment
Спасибо. Я изменил Clients.Caller.sendSomeData(hello); в Clients.Client(Context.ConnectionId).sendOrders(hello); и все работает. - person Denis; 15.04.2013
comment
Этот ответ не отвечает на вопрос, он не имеет отношения к делу и является скорее общим информационным ответом. Последнее изменение Clients.Caller.sendSomeData(hello); в Clients.Client(Context.ConnectionId).sendOrders(hello); не должно иметь значения. Я бы рекомендовал отменить пометку этого ответа как правильного и продолжить изучение проблемы. - person N. Taylor Mullen; 16.04.2013