【问题标题】:Updates in the server backend are not being published to the web client服务器后端中的更新未发布到 Web 客户端
【发布时间】:2017-01-12 12:40:10
【问题描述】:

我正在创建一个后端服务,它将新文章写入数据库,并在完成后将更改发布到前端层的监听客户端。我的问题是这些 BE 更新没有触发我在前端层的订阅者。

直接测试TaskHub(signalR backend asp.net hub)层似乎工作正常,但UI没有更新。下面是各个层的相关代码(我可能会遗漏一两件事 - 询问是否有问题)。

事情的顺序:

从在客户端调用这个开始:

 var taskHub = $.connection.taskHub;

 $.connection.hub.start();

然后我有这个 Knockout 功能来进行更新:

self.AddQuickNews = function() {
        taskHub.server.AddAndUpdateQuickNews(self.newContent());  /just a string
    }

在 ASP.NET 后端我有以下方法来处理这个:

public void AddAndUpdateQuickNews(string newContent)
    {
        ArticleServices.AddQuickNews(newContent); //add a new record
        var quicknews = ArticleServices.GetQuickNews();  // get all records
        Clients.All.updateQuickNews(quicknews);  // pass back to clients

    }

在客户端处理结果:

taskHub.client.UpdateQuickNews = function (quicknews) {
    quicknewsmodel.quicknews(quicknews);
    console.log("SignalR -> " + quicknews);
    //console.log("Fra UpdateMatches: " + matches);
}

XHR 调用以测试后端

self.AddQuickNews = function () {
        var url = 'api/MainPage/AddQuickNews';
        var params = "?content=" + self.newContent();
        $.ajax({
            url: url + params,
            type: 'GET',
            dataType: 'json',
            contentType: 'application/json; charset=utf-8',
            success: function (data) {
                taskHub.server.updateQuickNews(data);
            },
            error: function () {
                //alert("error");
            }
        });
    }

【问题讨论】:

  • 由于 BE 逻辑似乎工作正常,问题很可能只是与设置发布者和订阅者有关。
  • 其他客户端方法是否有效? AddAndUpdateQuickNews 方法是否在 Hub 类中?

标签: c# asp.net knockout.js websocket signalr


【解决方案1】:

在我看来,这是因为当您在客户端声明侦听器时,您在第一个字母中使用了大写字母。 SignalR 不允许这种行为。你必须改变你的听众变成:

taskHub.client.updateQuickNews = function (quicknews) {
    quicknewsmodel.quicknews(quicknews);
    console.log("SignalR -> " + quicknews);
    //console.log("Fra UpdateMatches: " + matches);
}

taskHub.server.addAndUpdateQuickNews(self.newContent()); /just a string

希望对你有帮助

【讨论】:

  • "方法名匹配不区分大小写。例如,服务器上的Clients.All.addContosoChatMessageToPage将在客户端执行AddContosoChatMessageToPageaddContosoChatMessageToPageaddcontosochatmessagetopage。"取自官方文档。
  • 这是对的,事实上,.. 在查看错误的地方时很难找到我自己的错误 :) 但是还有一个额外的错误,这是至关重要的。由于这是与 asp.net 上下文相关的,并且我使用的是 httpcontext,因此无法直接在 hubcontext 中使用它。问题是我吞下了错误/异常,它只是继续,因为没有任何问题。所以要解决这个问题,我不得不使用:IPrincipal principal = Thread.CurrentPrincipal; var identity = principal.Identity; ,然后将必要的信息传递给依赖该信息的依赖服务:)
猜你喜欢
  • 1970-01-01
  • 2020-03-02
  • 1970-01-01
  • 2012-01-17
  • 2021-07-31
  • 1970-01-01
  • 1970-01-01
  • 2013-06-29
  • 2014-09-04
相关资源
最近更新 更多