.net core .NetCore 2.2信号器问题
我在一个项目中遇到了一些问题,该项目试图使用signar向所有连接的客户端调用数据源读取请求,以进行网格数据刷新,以便用户实时查看更新 在VisualStudio中使用两个打开的chrome窗口运行时,它可以在本地运行IIS Express。SignalR在两个窗口中都连接,并在两个浏览器窗口中修改时调用datasource read execute而不出错 部署到运行IIS 10.0.17763.1的服务器时,会出现错误 该应用程序托管在一台服务器上,如果浏览器窗口打开,则与SignalR的连接将正常工作(我从wait connection.start调用接收connected的控制台日志)。但是,当在另一台计算机上打开或打开第二个浏览器窗口时,每个浏览器实例的控制台中都会出现多个SingalR故障 错误如下:.net core .NetCore 2.2信号器问题,.net-core,signalr,asp.net-core-2.1,asp.net-core-signalr,.net Core,Signalr,Asp.net Core 2.1,Asp.net Core Signalr,我在一个项目中遇到了一些问题,该项目试图使用signar向所有连接的客户端调用数据源读取请求,以进行网格数据刷新,以便用户实时查看更新 在VisualStudio中使用两个打开的chrome窗口运行时,它可以在本地运行IIS Express。SignalR在两个窗口中都连接,并在两个浏览器窗口中修改时调用datasource read execute而不出错 部署到运行IIS 10.0.17763.1的服务器时,会出现错误 该应用程序托管在一台服务器上,如果浏览器窗口打开,则与SignalR的连
public class TrafficWorkflowHub : Hub
{
public async Task UpdateDataSource()
{
await Clients.All.SendAsync("ReceiveUpdates");
}
}
浏览器计算机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");
});
确保您这样配置COR(顺序很重要):
services.AddCors(选项=>
{
options.AddPolicy(CorsPolicy,builder=>builder.WithOrigins(“https://yourFrameworkApp.azurewebsites.com")
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials()
.SetIsOriginAllowed((主机)=>true));
});
然后确保在启动时配置方法中有:
app.UseHttpsRedirection();
app.UseWebSockets();
不要忘记在服务器上启用WebSocket:
你好。欢迎来到stackoverflow。如何在后端配置CORS?在startup.cs中的configure as app.UseCors(builder=>{builder.WithOrigins(“).AllowAnyHeader().WithMethods(“GET”,“POST”).allowredentials();});您好,不幸的是,它没有按预期工作。我们将项目移动到另一台服务器,发现它在未经修改的情况下按预期工作。因此,原始服务器存在导致其失败的问题。原始服务器确实安装了WebSocket协议,因此我不确定从何处开始查找。我非常感谢助手。感谢您花时间和精力协助这项工作。