Asp.net mvc Can';t从服务器调用客户端函数
我正在研究一个小概念,试图与信号员合作。 在这个场景中,当其中一个客户端执行更新时,所有连接的客户端都需要刷新,这个更新是通过Ajax请求执行的。 因为页面可能有不同的实例,这取决于一个参数,所以我使用组 客户端代码如下所示:Asp.net mvc Can';t从服务器调用客户端函数,asp.net-mvc,signalr,Asp.net Mvc,Signalr,我正在研究一个小概念,试图与信号员合作。 在这个场景中,当其中一个客户端执行更新时,所有连接的客户端都需要刷新,这个更新是通过Ajax请求执行的。 因为页面可能有不同的实例,这取决于一个参数,所以我使用组 客户端代码如下所示: <script> window.onload = function () { DoRefresh(); } $(function () { var hub = $.connection.commonHu
<script>
window.onload = function () {
DoRefresh();
}
$(function () {
var hub = $.connection.commonHub;
hub.client.refresh = function () {
DoRefresh();//This doesn't get called for the other clients
};
$.connection.hub.start();
$.connection.hub.start().done(function () {
hub.server.join("MyPage" + @Model.Id + "");
});
});
function htmlEncode(value) {
var encodedValue = $('<div />').text(value).html();
return encodedValue;
}
function DoRefresh() {
$.ajax({
url: '@Url.Action("LoadData")',
cache: false,
data: "&id=" + @Model.Id + "",
success: function (html) {
$("#conversation").empty();
$("#conversation").append(html);
},
error: function (xhr, status, err) {
alert('Response code:' + xhr.status + '\r\n[Error:' + err + '] ' + status);
}
});
return false;
};
function DoUpdate() {
$.ajax({
url: '@Url.Action("DoUpdate")',
cache: false,
data: "&id=" + @Model.Id + "&posterID=" + @userAccount.AccountID + "&message=" + $("#Textbox").val().replaceAll("\n", "[br]"),
success: function () {
$("#Textbox").empty();
DoRefresh();
},
error: function () {
$("#Textbox").empty();
DoRefresh();
}
});
return false;
};
</script>
最后,我的hub类如下所示:
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Threading.Tasks;
using System.Web;
using Microsoft.AspNet.SignalR;
using MyProject.Models;
namespace MyProject.Hubs
{
public class CommonHub : Hub
{
private string myInfo;
public override Task OnConnected()
{
myInfo = Context.ConnectionId;
return base.OnConnected();
}
public Task Join(string groupName)
{
return Groups.Add(Context.ConnectionId, groupName);
}
public Task Leave(string groupName)
{
return Groups.Remove(Context.ConnectionId, groupName);
}
public void Refresh(string groupName)
{
var context = GlobalHost.ConnectionManager.GetHubContext<CommonHub>();
context.Clients.Group(groupName).Refresh();
}
}
}
使用系统;
使用System.Collections.Generic;
使用System.Data.Entity;
使用System.Linq;
使用System.Threading.Tasks;
使用System.Web;
使用Microsoft.AspNet.signal;
使用MyProject.Models;
名称空间MyProject.Hubs
{
公共类CommonHub:Hub
{
私有字符串myInfo;
已连接的公用覆盖任务()
{
myInfo=Context.ConnectionId;
返回base.OnConnected();
}
公共任务联接(字符串组名)
{
返回Groups.Add(Context.ConnectionId,groupName);
}
公共任务休假(字符串组名)
{
返回Groups.Remove(Context.ConnectionId,groupName);
}
公共无效刷新(字符串组名)
{
var context=GlobalHost.ConnectionManager.GetHubContext();
context.Clients.Group(groupName.Refresh();
}
}
}
每次连接新浏览器窗口时,都会调用中心中的Join
任务。Refresh
方法在集线器上被调用,但只有调用窗口的页面被刷新。客户端refresh
函数在调试时仅被调用一次,可能是针对调用的客户端
我不知道其他客户端为什么没有进行更新,请帮助。在您的更新操作中,
hub.Refresh(“MyPage”+item.Id)中如何定义hub
代码>?它在控制器内声明为全局变量。我已经编辑了OP以包含声明。显然不是信号器出错,但是LoadData操作没有正确地获取更新的数据。现在一切都好了。
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Threading.Tasks;
using System.Web;
using Microsoft.AspNet.SignalR;
using MyProject.Models;
namespace MyProject.Hubs
{
public class CommonHub : Hub
{
private string myInfo;
public override Task OnConnected()
{
myInfo = Context.ConnectionId;
return base.OnConnected();
}
public Task Join(string groupName)
{
return Groups.Add(Context.ConnectionId, groupName);
}
public Task Leave(string groupName)
{
return Groups.Remove(Context.ConnectionId, groupName);
}
public void Refresh(string groupName)
{
var context = GlobalHost.ConnectionManager.GetHubContext<CommonHub>();
context.Clients.Group(groupName).Refresh();
}
}
}