SignalR ping 失败并出现 CORS Access-Control-Allow-Origin 错误

SignalR ping fails with CORS Access-Control-Allow-Origin error

在我的项目中,negotiateconnectstart API 调用都包含所需的 access-control-allow-origin header。但是,一旦 SignalR 调用 ping 方法,它就会抛出以下错误:

Access to XMLHttpRequest at 'https://backend.url/signalr/signalr/ping&_=1643292246714'
from origin 'https://frontend.url' has been blocked by CORS policy:
No 'Access-Control-Allow-Origin' header is present on the requested resource.

我已经根据 Microsoft 的文档修改了我的 Startup.cs 文件。我是旧版本,我使用的是 MapSignalR 方法。

public class Startup {
    public void Configuration(IAppBuilder app) {
        // Branch the pipeline here for requests that start with "/signalr"
        app.Map("/signalr", map =>
        {
            // Setup the CORS middleware to run before SignalR. By default this will allow all origins.
            map.UseCors(CorsOptions.AllowAll);
            map.RunSignalR();
        });

        app.UseCors(CorsOptions.AllowAll);
    }
}

但是,此更改没有任何效果。 CORS 错误仍然存​​在。知道这里出了什么问题吗?

我在 .NET Framework 4.8 中使用 Microsoft.AspNet.SignalR 2.4.2 和 Microsoft.Owin.Cors 4.2.0。

我也不明白,为什么在URL中调用/signalr/signalr。

您应该像这样配置您的 CORS (顺序很重要):

services.AddCors(options =>
{
    options.AddPolicy("CorsPolicy", builder => builder.WithOrigins(YourOriginsHere)
        .AllowAnyHeader()
        .AllowAnyMethod()
        .AllowCredentials()
        .SetIsOriginAllowed((host) => true));
});

Note: Avoid putting * in the origins, it is better to create an array of strings with the possible origins, ideally reading it from configuration.

更新:对于 .NET Framework,请查看如何从此 Microsoft documentation.

启用 CORS

实际问题是我使用的客户端库中的错误。解决方案是更新我的 client-side npm 包 signalr-asp-net。我还有 1.0.0 版本并更新到 1.0.3。现在问题解决了。