.net core .NetCore 2.2信号器问题

.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的连

我在一个项目中遇到了一些问题,该项目试图使用signar向所有连接的客户端调用数据源读取请求,以进行网格数据刷新,以便用户实时查看更新

在VisualStudio中使用两个打开的chrome窗口运行时,它可以在本地运行IIS Express。SignalR在两个窗口中都连接,并在两个浏览器窗口中修改时调用datasource read execute而不出错

部署到运行IIS 10.0.17763.1的服务器时,会出现错误

该应用程序托管在一台服务器上,如果浏览器窗口打开,则与SignalR的连接将正常工作(我从wait connection.start调用接收connected的控制台日志)。但是,当在另一台计算机上打开或打开第二个浏览器窗口时,每个浏览器实例的控制台中都会出现多个SingalR故障

错误如下:

  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协议,因此我不确定从何处开始查找。我非常感谢助手。感谢您花时间和精力协助这项工作。