【发布时间】:2021-01-04 08:16:17
【问题描述】:
我在尝试使用 SignalR 向所有连接的客户端调用数据源读取请求以刷新网格数据以便用户实时查看更新的项目时遇到一些问题。
这适用于本地 IIS Express,同时使用两个打开的 chrome 窗口在 Visual Studio 中运行。 SignalR 在两个窗口中都连接,并在任一浏览器窗口中进行修改时调用数据源读取执行而不会出错。
部署到运行 IIS 10.0.17763.1 的服务器时,会出现错误。
应用程序托管在一台服务器上,如果打开浏览器窗口,则与 SignalR 的连接正常(我从 await connection.start 调用收到连接的控制台日志)。但是,当在另一台计算机上打开或打开第二个浏览器窗口时,SingalR 的多个故障开始出现在每个浏览器实例的控制台中。
错误如下:
浏览器机器 1:
https://FQDN:2424/trafficWorkflowHub?id=YPCykB9G94tbgzlnZZDi5g 404 (Not Found)
Error: Server returned handshake error: An unexpected error occurred during connection handshake.
InvalidDataException: Missing required property 'protocol'. Message content: {"arguments":
[],"invocationId":"1","target":"UpdateDataSource","type":1}
TrafficWorkflow:181 Error: Not Found
at new HttpError (signalr.js:1487)
at XMLHttpRequest.xhr.onload (signalr.js:1777)
TrafficWorkflow:182 connected
浏览器机器 2:
signalr.js:3927 WebSocket connection to 'wss://FQDN:2424/trafficWorkflowHub?id=2sW4zudCQKoysUQB9mB1vQ'
failed: Error during WebSocket handshake: Unexpected response code: 404
signalr.js:2684 [2020-09-17T10:57:34.529Z] Information: SSE connected to
https://FQDN:2424/trafficWorkflowHub?id=E9M_Wkbpt1KBPcHxLHhJXA
signalr.js:1788 POST https://FQDN:2424/trafficWorkflowHub?id=E9M_Wkbpt1KBPcHxLHhJXA 404 (Not Found)
signalr.js:2678 [2020-09-17T10:57:34.060Z] Error: Failed to start the transport 'WebSockets': null
代码示例如下。
客户端代码:
const connection = new signalR.HubConnectionBuilder()
.withUrl("/trafficWorkflowHub")
.build();
async function start() {
try {
await connection.start().catch(err => console.error(err));
console.log("connected");
} catch (err) {
console.log(err);
setTimeout(() => start(), 5000);
}
}
connection.onclose(async () => {
await start();
});
connection.on("ReceiveUpdates", function () {
callDataSourceRead();
});
start() 在文档就绪部分。
通过此调用调用更新 cshtml 页面中的数据源:
connection.invoke("UpdateDataSource").catch(function (err) {
return console.error(err.toString());
});
服务器端代码如下:
public class TrafficWorkflowHub : Hub
{
public async Task UpdateDataSource()
{
await Clients.All.SendAsync("ReceiveUpdates");
}
}
在 Startup.cs 中 公共无效配置
app.UseSignalR(routes =>
{
routes.MapHub<TrafficWorkflowHub>("/trafficWorkflowHub");
});
公共无效配置服务
services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
});
【问题讨论】:
-
你好。欢迎来到stackoverflow。您如何在后端配置 CORS?
-
在 startup.cs 下配置为 app.UseCors(builder => { builder.WithOrigins("FQDN:2424/") .AllowAnyHeader() .WithMethods("GET", "POST") .AllowCredentials ();});
标签: .net-core signalr asp.net-core-2.1 asp.net-core-signalr