在 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 请求。
大家好我只想问一下如何在 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 请求。