在非 MVC 项目中从客户端调用 SignalR 服务器端方法

SignalR Server side method call from Client side in Non MVC project

我熟悉 WebMethods 和 PageMethods,可以在不刷新页面的情况下从客户端调用服务器端方法。

我正在实现调用服务器端方法(存在于 index.aspx.cs 中)。

这是我正在尝试的:

服务器端 创建中心 class:

public class MyHub : Hub
{
    public void RefreshData(string imessage)
    {

        Clients.All.displayData(imessage);

    }
}

客户端:

<script>
    var isconnected = false;
    (function () {

        $.connection.myHub.client.displayData = function (thisdata) {
            $('ul').append('<li>' + thisdata + '</li>');
        };

        $("#btnadd").click(function () {
            if (isconnected) {
                $.connection.myHub.server.refreshData($("#txtval").val());
            }
        });

        $.connection.hub.start()
            .done(function () {

                isconnected = true;
            })
            .fail(function () {
                isconnected = false;
            });


    })();

</script>

以上一切正常,客户端正在调用服务器端的 RefreshData 方法,服务器正在将消息传递给客户端的 displayData 方法。

我的问题是:与AJAX WebMethod()一样..是否可以调用index.aspx.cs的任何方法(不在MyHub内部class) ?

如果我谈论从 index.aspx.cs 调用客户端方法,那么我们可以尝试:

var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
context.Clients.All.displayData(imessage);

但是如果我搜索来自任何 page.aspx.cs 的监听​​客户端的方法调用,我什么也得不到..

我希望我已经解释了这个问题,如果没有..请原谅..

不,您不能使用 SignalR 连接调用 aspx.cs 方法(集线器外部)。您需要使用 SignalR 调用 aspx.cs 方法的具体场景是什么?如您所述,使用 ajax 调用 aspx.cs 方法。

事实上,对于上面提到的代码片段,ajax 最适合(不是 信号R)。

SignalR 主要用于客户端和服务器之间需要打开连接的情况(例如使用 websocket,SignalR 支持的传输选项之一)。如果您需要在客户端不请求的情况下将消息从服​​务器推送到客户端,则更合适。

// Invoke this from server when server want to push some information to client without client requesting this information
$.connection.myHub.client.updateData = function (thisdata) {
        $('ul').append('<li>' + thisdata + '</li>');
    };