【问题标题】:.NetCore 2.2 SignalR issue.Net Core 2.2 SignalR 问题
【发布时间】: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


【解决方案1】:

确保您像这样配置 CORS(顺序很重要):

services.AddCors(options =>
{
    options.AddPolicy(CorsPolicy, builder => builder.WithOrigins("https://yourFrameworkApp.azurewebsites.com")
        .AllowAnyHeader()
        .AllowAnyMethod()
        .AllowCredentials()
        .SetIsOriginAllowed((host) => true));
});

然后确保你有那些关于启动时的配置方法:

app.UseHttpsRedirection();
app.UseWebSockets();

别忘了在服务器上启用 websockets:

【讨论】:

  • 您好,很遗憾,它没有按预期工作。我们将项目移动到另一台服务器,发现它按预期工作,没有任何修改。因此,原始服务器存在某些问题导致它失败。原始服务器确实安装了 WebSocket 协议,所以我不确定从哪里开始。
  • 非常感谢这位助手。感谢您抽出时间和精力来协助解决此问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-19
  • 2021-12-06
  • 1970-01-01
  • 1970-01-01
  • 2019-06-15
  • 2020-05-28
  • 1970-01-01
相关资源
最近更新 更多