SignalR 2.1.2 无法从客户端调用服务器方法,但可以从服务器调用客户端
SignalR 2.1.2 Cannot call server method from client, but can call client from server
我不确定这里出了什么问题,一定是简单到愚蠢。但是我检查了所有内容,尝试了几种不同的方法,但都没有成功。
服务器到客户端的通信效果很好。没问题。
但是当我调用 notifications.server.test();
时,我什么也没得到。纳达.
我可以从服务器调用我的 testFunction() 并且它有效。但是调用集线器的 Test() 方法(它只调用 testFunction)没有给我任何帮助。
这里是中心:
namespace XXXX.Hubs
{
[HubName("monitoringHub")]
public class MonitoringHub : Hub
{
[HubMethodName("sendCustomers")]
public static void SendCustomers()
{
IHubContext context = GlobalHost.ConnectionManager.GetHubContext<MonitoringHub>();
context.Clients.All.updateCustomers();
}
[HubMethodName("sendDetails")]
public static void SendDetails(string SONumber)
{
IHubContext context = GlobalHost.ConnectionManager.GetHubContext<MonitoringHub>();
context.Clients.All.updateDetails(SONumber);
}
[HubMethodName("test")]
public static void Test()
{
IHubContext context = GlobalHost.ConnectionManager.GetHubContext<MonitoringHub>();
context.Clients.All.testFunction();
}
}
}
和客户端代码:
@section Scripts{
<script src="/Scripts/systemdetails.js"></script>
<script src="/Scripts/jquery.signalR-2.1.2.js"></script>
<!--Reference the autogenerated SignalR hub script. -->
<script src="/signalr/hubs"></script>
<script type="text/javascript">
$(function () {
// Declare a proxy to reference the hub.
var notifications = $.connection.monitoringHub;
//debugger;
// Create a function that the hub can call to broadcast messages.
notifications.client.updateDetails = function (sonumber) {
getDetails(sonumber)
};
notifications.client.testFunction = function () {
alert("Test Function");
};
// Start the connection.
$.connection.hub.start().done(function () {
//alert("connection started")
getDetails(@Model.Customer.SONumber.ToString());
setInterval(function (){
alert("Test Call");
notifications.server.test();
}, 5000);
}).fail(function (e) {
alert(e);
});
});
function getDetails(sonumber) {
if(sonumber = (@Model.Customer.SONumber.ToString())){
var tbl = $('#systemDetails');
$.ajax({
url: '/Monitoring/GetDetails/@Model.Customer.SONumber.ToString()',
contentType: 'application/html ; charset:utf-8',
type: 'GET',
dataType: 'html',
cache: false
}).success(function (result) {
storeVis();
tbl.empty().append(result);
}).complete(function(){
recallVis();
}).error(function () {
});
}
}
</script>
}
我的间隔函数按预期发出警报,然后它应该调用返回的 hub 方法并调用 testFunction 发出第二个警报。当我尝试从客户端调用集线器方法时,我无法触发第二个警报,但如果我在服务器端调用集线器方法(或 Clients.All.testFunction),它工作正常。给出了什么?
在服务器端,我尝试了不同的格式来调用服务器集线器,但根据我所使用的版本的文档,现在应该是这样的。
notifications.client.test()
没有。
notifications.test()
没有。
notifications.server.test()
没有
客户端看不到您的函数,因为它们不是集线器实例的一部分。它们是静态的,因此 SignalR 集线器序列化程序不会将它们写出到集线器的动态 javascript 文件中。
如果您必须为其他 classes 访问静态函数,则需要将非静态函数添加到您的集线器 class 以调用您的静态函数。然后您的客户将能够访问它们。
我不确定这里出了什么问题,一定是简单到愚蠢。但是我检查了所有内容,尝试了几种不同的方法,但都没有成功。
服务器到客户端的通信效果很好。没问题。
但是当我调用 notifications.server.test();
时,我什么也没得到。纳达.
我可以从服务器调用我的 testFunction() 并且它有效。但是调用集线器的 Test() 方法(它只调用 testFunction)没有给我任何帮助。
这里是中心:
namespace XXXX.Hubs
{
[HubName("monitoringHub")]
public class MonitoringHub : Hub
{
[HubMethodName("sendCustomers")]
public static void SendCustomers()
{
IHubContext context = GlobalHost.ConnectionManager.GetHubContext<MonitoringHub>();
context.Clients.All.updateCustomers();
}
[HubMethodName("sendDetails")]
public static void SendDetails(string SONumber)
{
IHubContext context = GlobalHost.ConnectionManager.GetHubContext<MonitoringHub>();
context.Clients.All.updateDetails(SONumber);
}
[HubMethodName("test")]
public static void Test()
{
IHubContext context = GlobalHost.ConnectionManager.GetHubContext<MonitoringHub>();
context.Clients.All.testFunction();
}
}
}
和客户端代码:
@section Scripts{
<script src="/Scripts/systemdetails.js"></script>
<script src="/Scripts/jquery.signalR-2.1.2.js"></script>
<!--Reference the autogenerated SignalR hub script. -->
<script src="/signalr/hubs"></script>
<script type="text/javascript">
$(function () {
// Declare a proxy to reference the hub.
var notifications = $.connection.monitoringHub;
//debugger;
// Create a function that the hub can call to broadcast messages.
notifications.client.updateDetails = function (sonumber) {
getDetails(sonumber)
};
notifications.client.testFunction = function () {
alert("Test Function");
};
// Start the connection.
$.connection.hub.start().done(function () {
//alert("connection started")
getDetails(@Model.Customer.SONumber.ToString());
setInterval(function (){
alert("Test Call");
notifications.server.test();
}, 5000);
}).fail(function (e) {
alert(e);
});
});
function getDetails(sonumber) {
if(sonumber = (@Model.Customer.SONumber.ToString())){
var tbl = $('#systemDetails');
$.ajax({
url: '/Monitoring/GetDetails/@Model.Customer.SONumber.ToString()',
contentType: 'application/html ; charset:utf-8',
type: 'GET',
dataType: 'html',
cache: false
}).success(function (result) {
storeVis();
tbl.empty().append(result);
}).complete(function(){
recallVis();
}).error(function () {
});
}
}
</script>
}
我的间隔函数按预期发出警报,然后它应该调用返回的 hub 方法并调用 testFunction 发出第二个警报。当我尝试从客户端调用集线器方法时,我无法触发第二个警报,但如果我在服务器端调用集线器方法(或 Clients.All.testFunction),它工作正常。给出了什么?
在服务器端,我尝试了不同的格式来调用服务器集线器,但根据我所使用的版本的文档,现在应该是这样的。
notifications.client.test()
没有。
notifications.test()
没有。
notifications.server.test()
没有
客户端看不到您的函数,因为它们不是集线器实例的一部分。它们是静态的,因此 SignalR 集线器序列化程序不会将它们写出到集线器的动态 javascript 文件中。
如果您必须为其他 classes 访问静态函数,则需要将非静态函数添加到您的集线器 class 以调用您的静态函数。然后您的客户将能够访问它们。