SignalR: How to call the .Net client method from the server?

I want to send data to my console application, which has a connection to my "someHub". I tried to do as described in the example by reference, but did not get the result. Server Code:

[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();
    }
}

Client Code:

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();
    }
}

What is the best solution to implement this and for what reason I cannot call the client method?

+5
source share
1 answer

Are you trying to talk with customers outside the Hub? If so, you will have to get the HubContext outside the hub. And then you can talk with all the customers.

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

SignalR Server Using Owin Standalone Host

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 An application that uses Signalr Hubs.

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();
        }
    }

, , , , , .

+9

All Articles