【问题标题】:SignalR ping fails with CORS Access-Control-Allow-Origin errorSignalR ping 失败并出现 CORS Access-Control-Allow-Origin 错误
【发布时间】:2022-02-03 03:34:19
【问题描述】:

在我的项目中,negotiateconnectstart API 调用都包含所需的 access-control-allow-origin 标头。但是,一旦 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.

我已经根据微软的文档修改了我的 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 错误仍然存​​在。知道这里有什么问题吗?

我将 Microsoft.AspNet.SignalR 2.4.2 和 Microsoft.Owin.Cors 4.2.0 与 .NET Framework 4.8 一起使用。

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

【问题讨论】:

  • 您还必须在客户端应用中配置 CORS

标签: c# asp.net-mvc cors signalr


【解决方案1】:

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

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

注意:避免将* 放在源中,最好创建一个具有可能源的字符串数组,最好从配置中读取。

更新:对于 .NET Framework,请参阅如何从此 Microsoft documentation 启用 CORS。

【讨论】:

  • 这是否也适用于 .NET Framework 4.8?这不是核心应用程序。而且我没有services 属性
  • 嗯,该解决方案使用属性并且用于 WebAPI 调用。我不能将它与 SignalR 一起使用,因为我无法修改其自动生成的方法。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2021-12-02
    • 2021-06-17
    • 2018-03-05
    • 2019-09-20
    • 2019-02-07
    • 2016-09-30
    • 2016-09-09
    • 2015-08-17
    • 2014-08-11
    相关资源
    最近更新 更多