问题描述
我在一个项目中遇到了一些问题,该项目试图使用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();
});
在“文档准备就绪”部分。
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: