【问题标题】:SignalR: How to call .Net client method from server?SignalR:如何从服务器调用 .Net 客户端方法?
【发布时间】:2013-04-14 21:12:13
【问题描述】:

我想将数据发送到我的控制台应用程序,该应用程序与我的“someHub”有连接。我尝试按照a link 的示例中所述进行操作,但没有得到任何结果。 服务器端代码:

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

实现这一点的最佳解决方案是什么?我无法调用客户端方法的原因是什么?

【问题讨论】:

  • 你打电话给 MapHubs 了吗?
  • 是的,我做到了。从客户端到服务器的调用工作正常,例如: myHub.Invoke("GetValue").ContinueWith(task => Console.WriteLine("Value from server {0}", task.Result)); ,但从服务器到客户端 - 没有

标签: signalr signalr-hub signalr.client


【解决方案1】:

您是否尝试与 Hub 之外的客户交谈?如果是,那么您将必须在 Hub 之外获取 HubContext。然后你可以和所有的客户交谈。

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

使用 Owin Self Host 的 SignalR 服务器

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

要运行此代码,请创建两个单独的应用程序,然后首先运行服务器应用程序,然后运行客户端控制台应用程序,然后只需在服务器控制台上按一下键,它就会开始向客户端发送消息。

【讨论】:

  • 谢谢。我改变了 Clients.Caller.sendSomeData("hello");到 Clients.Client(Context.ConnectionId).sendOrders("hello");一切正常。
  • 这个答案没有回答问题,它是不相关的,更多的是一般信息的答案。最后更改 Clients.Caller.sendSomeData("hello");到 Clients.Client(Context.ConnectionId).sendOrders("hello");不应该有所作为。我建议取消将此答案标记为正确并进一步调查该问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
相关资源
最近更新 更多