我熟悉WebMethods和PageMethods,无需刷新页面即可从客户端调用服务器端方法。
我正在实现调用服务器端方法(存在于index.aspx.cs中)。
以下是我正在尝试的内容:
服务器端创建的集线器类:
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方法,而Server正在将消息传递给客户端的displayData方法。
我的问题是:与AJAX WebMethod()相同..是否可以调用index.aspx.cs的任何方法(不在MyHub类中)?
如果我谈论从index.aspx.cs调用客户端方法,那么我们可以尝试:
var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
context.Clients.All.displayData(imessage);
但是,如果我从任何page.aspx.cs搜索关于侦听客户端方法的调用,我没有得到任何东西..
我希望我已经解释了这个问题,如果没有......请原谅..
答案 0 :(得分:0)
不,你不能使用SignalR连接调用aspx.cs方法(在Hub之外)。什么是需要使用SignalR调用aspx.cs方法的extact场景?正如您所提到的,使用ajax来调用aspx.cs方法。
对于上面提到的代码片段,ajax最适合(不是 SignalR)。
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>');
};