C# SignalR:从代码隐藏更新数据的问题

Posted

技术标签:

【中文标题】C# SignalR:从代码隐藏更新数据的问题【英文标题】:C# SignalR : Issues updating data from code-behind 【发布时间】:2017-11-16 19:26:38 【问题描述】:

.

我有一个后端应用程序(运行 .net c#)和一个在 node 和 VUE.JS 2 上运行的前端应用程序。

前端正在发布新订单,后端解决方案中的“仪表板”应使用 SignalR 自动获取新的传入订单。

我有大约 90% 的正确率,但在使用数据更新客户端时遇到问题。 (当前代码实际上是在循环中运行,一直在获取新数据)。

那么我如何以正确的方式从后端“强制”更新客户端?

Javascript- /FrontEnd 代码:

$(document).ready(function() 

    // start hub
    var orderHub = $.connection.orderHub;
    $.connection.hub.start().done(function () 
        console.log("Orderhub initialized...");
    );
    // end hub

    var OrdersModel = function() 
        var self = this;
        self.orders = ko.observableArray();
    
    var ordersmodel = new OrdersModel();

    orderHub.client.updateOrders = function (orders) 
        orderHub.server.getOrders().then(
            result => 
                ordersmodel.orders(result);
            
        ); 
        console.log("Getting updated orders : " + orders);
    

    ko.applyBindings(ordersmodel, document.getElementById("ordersContainer"));

    $.get('api/Order',
        function (data) 
            ordersmodel.orders(data);
            console.log("API kall - GetOrders");
        , 'json');
);

Orderhub.cs 代码:

public void GetOrders()
    
        var loggedInCompany = 2;
        var orders = OrderServices.GetNewestOrdersAsVM(loggedInCompany);
        Clients.All.updateOrders(orders);
    

来自前端的 POST 调用(触发更新):

public HttpResponseMessage Post([FromBody] OrderViewModel newOrder)
    
        var result = OrderServices.SaveNewOrderFromVM(newOrder);

        var context = GlobalHost.ConnectionManager.GetHubContext<OrderHub>();
        context.Clients.All.updateOrders();

        return result;
    

【问题讨论】:

这里有一篇文章展示了如何订阅事件:docs.microsoft.com/en-us/aspnet/signalr/overview/…。重要的是要记住,在开始连接之前您至少需要订阅一个事件 【参考方案1】:

这一切看起来都是正确的,除了在您的控制器中,您调用 updateOrders() 没有参数,而您的客户端回调需要订单。在您的 Post 操作中,您实际上需要运行:

var loggedInCompany = 2;
var orders = OrderServices.GetNewestOrdersAsVM(loggedInCompany);
var context = GlobalHost.ConnectionManager.GetHubContext<OrderHub>();
context.Clients.All.updateOrders(orders);

我通常使用我的 SignalR 集线器来维护连接的客户端,以应对需要与特定客户端交互的场景,或者当您需要服务器上可以由客户端调用的方法时。为了处理我所有的 SignalR 交互,我使用了一个包装类。

【讨论】:

以上是关于C# SignalR:从代码隐藏更新数据的问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 signalR 在客户端隐藏或显示元素

WCF 服务中的 SignalR 用于更新网站客户端

SignalR的使用

更新 knockout.js 和 SignalR 库后,knockout-mapping js 不会更新视图中的列表

无法将数据从 DataSet 更新到 C# 和 SQL Server 上的数据库

Blazor模式讲解