.NetCore 2.2 SignalR问题

问题描述

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

当在Visual Studio中使用两个打开的Chrome窗口运行时,这可以在本地IIS Express上运行。在两个浏览器窗口中进行修改时,SignalR都在两个窗口中连接,并要求数据源读取执行无错误

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

该应用程序托管在一台服务器上,并且如果打开浏览器窗口,则与SignalR的连接有效(我从await connection.start调用接收到connect的控制台日志)。但是,当第二个浏览器窗口打开或在另一台计算机上打开时,针对每个浏览器实例,SingalR的多个故障开始出现在控制台中。

错误如下:

浏览器机器1:

df['hashtag'][i] = re.findall("(#[A-Za-z0-9]+)",df['text'][i])

浏览器机器2:

    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

代码示例如下。

客户端代码

 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] @R_707_4045@ion: 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(); }); 在“文档准备就绪”部分。

通过该调用调用调用以更新cshtml页面中的数据源:

start()

服务器端代码如下:

 connection.invoke("UpdateDataSource").catch(function (err) {
                    return console.error(err.toString());
                });

在Startup.cs中 公共无效配置

  public class TrafficWorkflowHub : Hub
    {

        public async Task UpdateDataSource()
        {
            await Clients.All.SendAsync("ReceiveUpdates");
        }

    }

公共无效的ConfigureServices

app.UseSignalR(routes =>
            {
                routes.MapHub<TrafficWorkflowHub>("/trafficWorkflowHub");
           
            });

解决方法

确保以这种方式配置CORS(顺序很重要):

    ## plot scatter point that will follow the line
    sc_3.set_offsets(np.c_[x[i],y[i]])

然后确保在启动时在配置方法中包含这些内容:

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

不要忘记在服务器上启用websocket:

enter image description here