.
我有一个后端应用程序(运行 .net c#(和一个在节点和 VUE 上运行的前端应用程序.JS 2。
前端正在发布新订单,后端解决方案中的"仪表板"应使用 SignalR 自动获取新的传入订单。
我有大约 90% 的正确率,但在使用数据更新客户端时遇到问题。(当前代码实际上是在循环中运行的,一直在获取新数据(。
那么我如何以正确的方式从后端"强制"客户端更新呢?
Javascript-/前端代码:
$(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');
});
订单中心.cs代码:
public void GetOrders()
{
var loggedInCompany = 2;
var orders = OrderServices.GetNewestOrdersAsVM(loggedInCompany);
Clients.All.updateOrders(orders);
}
来自前端的开机自检呼叫(触发更新(:
public HttpResponseMessage Post([FromBody] OrderViewModel newOrder)
{
var result = OrderServices.SaveNewOrderFromVM(newOrder);
var context = GlobalHost.ConnectionManager.GetHubContext<OrderHub>();
context.Clients.All.updateOrders();
return result;
}
一切看起来都正确,除了在你的控制器中,你调用updateOrders()
没有参数,而你的客户端回调需要订单。在发布操作中,您实际上需要运行:
var loggedInCompany = 2;
var orders = OrderServices.GetNewestOrdersAsVM(loggedInCompany);
var context = GlobalHost.ConnectionManager.GetHubContext<OrderHub>();
context.Clients.All.updateOrders(orders);
我通常仅将 SignalR 中心用于维护连接的客户端,以便在需要与特定客户端交互的情况下,或者当需要在服务器上使用可由客户端调用的方法时。为了处理我所有的 SignalR 交互,我使用包装类。