在 Signalr Core 中调用 Ajax 函数

Calling a Ajax function inside a Signalr Core

大家好我只想问一下如何在 signalR Core 中调用 Ajax 函数。这是我的示例代码。

顺便说一句,我正在使用 asp.net 核心 2.2

这是我的 SignalR 代码。这将调用 Ajax 函数“LoadTruckQueue”。当用户单击 ID 为 #sendButton 的按钮时。

"use strict";

var connection = new signalR.HubConnectionBuilder().withUrl("/TruckHub").build();

connection.on('CallLoadTruckQueue', function (actionMessage) {
if(actionMessage != null){
   LoadTruckQueue();
}
});
connection.start().then(function () {
    console.log("Connected")
}).catch(function (err) {
    return console.error(err.toString());
});
$(document).on('click', "#sendButton", function () {
    var actionMessage = document.getElementById("sendButton").value;
    connection.invoke("CallFunction", actionMessage).catch(function (err) {
        return console.error(err.toString());
    });
}); 

那么这是我的 TruckHub class,它有一个异步任务 CallFunction,它将调用 CallLoadTruckQueue 并有一个字符串参数 actionMessage。

using Microsoft.AspNetCore.SignalR;
using System;
using System.Threading.Tasks;

namespace Web_UI.Hubs
{
    public class TruckHub : Hub
    {
        /// <summary>
        /// </summary>
        /// <returns></returns>
        public async Task CallFunction(string actionMessage)
        {
            try
            {
                await Clients.All.SendAsync("CallLoadTruckQueue", actionMessage);
            }
            catch (Exception ex)
            {

                throw ex;
            }
        }
    }
} 

那么这是我的 Ajax 函数,名为 LoadTruckQueue

function LoadTruckQueue() {
    $.ajax({
        method: 'GET',
        url: "/Truck/GetNewTrucks",
    }).done(function (data, statusText, xhdr) {
        $("#divTransaction").html(data);
    }).fail(function (xhdr, statusText, errorText) {

        let errorHeader = "System Error!";
        let errorBody = "List of Trucks cannot be loaded.\nPlease contact your 
        administrator";

        //function calling to display the Error Message
        DisplayErrorModal(errorHeader, errorBody);
    });

}

嗯,我不确定在调用 Ajax 函数时是否需要实施 asynx/await 或承诺回调。由于 LoadTruckQueue() 函数正在 async/await 中的控制器中调用我的路线 /Truck/GetNewTrucks。非常感谢你们愿意花时间和精力来解决和帮助我的 issue/error.

您的 SignalR JS 客户端似乎会通过调用 jQuery.ajax() 方法执行异步 HTTP (Ajax) 请求,向后端服务发出额外的 HTTP 请求以获取“TruckQueue”相关数据,同时SignalR JS 客户端收到特定消息,没问题。

另一方面,如果可能,您可以在通用class中单独实现查询“TruckQueue”相关数据的数据访问逻辑,然后您可以reuse/consume那个通用class 方法直接在您的集线器方法中,这不需要从 SignalR JS 客户端向(外部)后端服务发出额外的 HTTP 请求。