C#SignalR:从代码隐藏

时间:2017-11-16 19:26:38

标签: javascript c# websocket signalr

我有一个后端应用程序(运行.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;
    }

1 个答案:

答案 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交互,我使用了一个包装类。