从代码隐藏调用 SignalR Hub 方法

Sre*_*nga 5 asp.net webforms signalr

我有一个带有母版页的网络应用程序,我需要向我的应用程序的所有连接用户显示警报。我使用了 Owin 启动类并映射了信号 R

然后创建一个如下所示的 Hub

    namespace ArtWebApp
{
    [HubName("artHub")]
    public class ArtWebHub : Hub
    {

        public void Hello()
        {
            Clients.All.hello();
        }


        public void SayMessage()
        {
            this.Clients.All.showmessage();

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在母版页中我添加了 Javascript,如下所示

 <script src="Scripts/jquery-1.6.4.js"></script>
    <script src="Scripts/jquery.signalR-2.2.1.js"></script>
    <script type="text/javascript">
        $(function () {
            debugger;
            var connection = $.hubConnection("")
            var hub = connection.createHubProxy('artHub');
            hub.on('showmessage', function () {

                alert('Hi');
            });


            connection.start().done();
            //connection.start(function () {

            //    hub.invoke('SayMessage');
            //});
        });

    </script>
Run Code Online (Sandbox Code Playgroud)

当从同一页面调用 Hub 方法时,这是完美的工作,但是当我尝试通过单击页面的按钮来调用该方法时,它不起作用

  protected void Button1_Click(object sender, EventArgs e)
    {            var hubContext = GlobalHost.ConnectionManager.GetHubContext<ArtWebApp.ArtWebHub>();
        hubContext.Clients.All.SayMessage();    
    }
Run Code Online (Sandbox Code Playgroud)

有人可以建议我这个问题吗

sca*_*tag 5

我从您的代码中看到的是您正在调用的客户端函数上的错误。

Clients.All通常允许您通过调用来调用您在客户端定义的函数Clients.All.functionName()

如果Button1_Click发生请更改

 hubContext.Clients.All.SayMessage(); 
Run Code Online (Sandbox Code Playgroud)

 hubContext.Clients.All.showMessage(); 
Run Code Online (Sandbox Code Playgroud)

这是因为您正在使用dynamic集合Clients

您正在尝试调用客户端函数(该函数不存在)。

您尝试调用的方法 SayMessage 是 ArtWebHub 类的成员,无法通过调用 来调用hubContext.Clients.All

您可以SayMessage使用从客户端调用hub.invoke('SayMessage'),但要调用showmessage客户端中定义的函数,您必须以与服务器不同的方式调用它,因为SayMessage该函数不可用于hubContext