我有一个后端应用程序(运行.net c#)和一个在节点和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;
}
答案 0 :(得分:0)
除了在你的控制器中,你看起来都是正确的,你没有参数调用updateOrders()
,而你的客户端回调需要订单。在你的Post动作中,你实际上需要运行:
var loggedInCompany = 2;
var orders = OrderServices.GetNewestOrdersAsVM(loggedInCompany);
var context = GlobalHost.ConnectionManager.GetHubContext<OrderHub>();
context.Clients.All.updateOrders(orders);
我通常使用我的SignalR中心来维护连接的客户端,以便我需要与特定客户端进行交互,或者您希望服务器上的方法可以被客户端调用。为了处理我的所有SignalR交互,我使用了一个包装类。