无法从服务器调用客户端功能

时间:2014-06-03 09:35:20

标签: asp.net-mvc signalr

我正在研究一个试图与SignalR合作的小概念。 在此方案中,所有连接的客户端需要在其中一个客户端执行更新时刷新,此更新通过Ajax请求执行。 因为页面可能有不同的实例,根据参数,我会使用组来进行此操作。

客户端代码如下所示:

<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>

在我的控制器中,以下功能是此方案的一部分:

    public class MyController : Controller 
    {
        private Hubs.CommonHub hub = new Hubs.CommonHub();

        //Some other Controller Methods

        public PartialViewResult LoadData(int id)
        {
            MyModel item = Connection.DB.MyData.FirstOrDefault(x => x.Id == id);
            return PartialView(item);
        }

        public virtual EmptyResult DoUpdate(int id, int posterID, string message)
        {
            message = message.Replace("[br]", "\r\n");
            MyModel item = Connection.DB.MyData.FirstOrDefault(x => x.Id == id);
            Account poster = Connection.DB.Accounts.FirstOrDefault(x => x.Id == posterID);;
            item.Updates.Add(new Update()
                                    {
                                        PosterId = posterID,
                                        Poster = poster,
                                        Id = id,
                                        Item = item,
                                        PostDate = DateTime.UtcNow,
                                        Message = message.Replace(Environment.NewLine,"\r\n")
                                    });
            Connection.DB.SaveChanges();
            hub.Refresh("MyPage" + item.Id);
            return null;
        }
    }

最后,我的集线器类看起来像这样:

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();
        }
    }
}

每次连接新浏览器窗口时都会调用集线器中的Join任务。在集线器上调用Refresh方法,但只有调用窗口刷新其页面。客户端refresh函数仅在调试时调用一次,可能是调用客户端。

我不知道为什么其他客户没有进行更新,请帮忙。

0 个答案:

没有答案