从代码后台调用SignalR Hub方法

5

我有一个带有主页的Web应用程序,我需要向我的应用程序的所有连接用户显示警报。我已经使用Owin启动类并映射了SignalR。

然后像下面这样创建了一个Hub:

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

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


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

        }
    }
}

然后在主页面中,我按照以下方式添加了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>

当从同一页调用Hub方法时,它可以完美地工作。但是当我尝试从页面的按钮单击调用该方法时,它就无法工作了。

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

有人能为我提供问题建议吗?

1个回答

4
我能看到你的代码中客户端函数调用有一个错误。
通常使用 Clients.All 可以通过调用 Clients.All.functionName() 来调用你在客户端定义的函数。
请在 Button1_Click 事件中进行更改。
 hubContext.Clients.All.SayMessage(); 

To

 hubContext.Clients.All.showMessage(); 

这是因为你正在使用动态集合"客户端"。你试图调用一个客户端函数(该函数并不存在)。方法"SayMessage"是"ArtWebHub"类的成员,无法通过调用"hubContext.Clients.All"来调用它。你可以使用"hub.invoke('SayMessage')"从客户端调用"SayMessage",但要调用在客户端定义的"showmessage"函数,则必须从服务器以不同方式调用它,因为"SayMessage"对"hubContext"不可用。

感谢您的答复。问题已解决,Signalr 已经在大多数主页面上运作正常。但是在某些页面上,我会收到一个错误信息 "对象不支持属性或方法 hubconnection",您能否提供任何建议? - Sreenath Ganga
@SreenathGanga 请确保在这些页面上加载了SignalR客户端库。当您遇到该错误时,通常就是问题所在。 - scartag
我已在主页面中使用绝对URL定义它<script src="/Scripts/jquery-1.6.4.js"></script> <script src="/Scripts/jquery.signalR-2.2.1.js"></script> - Sreenath Ganga
@SreenathGanga 你必须确认它在出现问题的页面上正确加载。 - scartag

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接