【问题标题】:CORS in ASP.Net MVC with SignalR causes "Access-Control-Allow-Origin" error带有 SignalR 的 ASP.Net MVC 中的 CORS 导致“Access-Control-Allow-Origin”错误
【发布时间】:2020-01-24 13:19:19
【问题描述】:

我在带有Angular 8ASP.NET MVC 项目中使用SignalR (v2.4.0) 并遇到“在'https:/demo.com/signalr/negotiate?clientProtocol=2.1&connectionData=' 处访问XMLHttpRequest from origin'@ 987654321@' 已被 CORS 策略阻止:请求的资源上不存在 'Access-Control-Allow-Origin' 标头。” 调试时出错(在 PROD 阶段也出现类似错误)。我曾尝试在Setting Access-Control-Allow-Origin in ASP.Net MVC - simplest possible method 上应用修复,但其中大多数都不起作用或不是全局修复。我宁愿在 Global.asaxStartup.cs 中全局修复,而不是应用 Controller 阶段(我也尝试了 web.config 修复,但从未奏效)。那么,是否有针对此问题的全局解决方案?

更新:这是我解决问题的配置:

Startup.cs:

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Owin;
using Owin;

[assembly: OwinStartup(typeof(Demo.Web.UI.App_Start.Startup))]
namespace Demo.Web.UI.App_Start
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.MapSignalR();
        }
    }
}

web.config:

<system.webServer>

    <httpProtocol>
        <customHeaders>
            <add name="Access-Control-Allow-Origin" value="http://localhost:20700"/>
            <add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE,OPTIONS"/>
            <add name="Access-Control-Allow-Headers" value="Content-Type"/>
        </customHeaders>
    </httpProtocol>    

</system.webServer>

【问题讨论】:

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


    【解决方案1】:

    为了为我工作,我在我的 startup.cs 中有这个...

    在“ConfigureServices”方法中:

    services.AddCors(options => {
             options.AddDefaultPolicy(builder => {
                 builder.WithOrigins("https://www.websitename.com").AllowAnyHeader().AllowAnyMethod();
             });
    });
    

    在“配置”方法中我有这个:

    app.UseCors(builder => {
        builder.WithOrigins("https://www.websitename.com").AllowAnyHeader().AllowAnyMethod();
    });
    

    然后在我的控制器中我有这个属性:

    [EnableCors]
    [Route("api/[controller]")]
    [ApiController]
    public class SampleController : ControllerBase
    {
      ...
    }
    

    这有帮助吗?

    【讨论】:

    • 感谢您的帮助。但是,我使用 ASP.NET MVC 并且没有 AddCors 方法。您能否使用库发布整个 Startup.cs?此外,我更喜欢全局修复,而不是向每个控制器添加 [EnableCors("AllowOrigin")] 表示法。有什么想法吗?
    • 您可以在 web.config 中添加 CORS 设置。这通常是我完成它的方式。 gist.github.com/Jalalhejazi/5653347
    • 修改了上面的代码,使其成为默认的全局策略,而不是专门命名的策略
    • @Svend 我已经尝试过在 ASP.Net MVC 中设置 Access-Control-Allow-Origin - 最简单的方法问题。但是我得到“无法访问请求的页面,因为该页面的相关配置数据无效。” 错误,然后删除 Access-Control-Allow-Methods 行。但在这种情况下仍然遇到“访问 XMLHttpRequest at 'https:/demo.com/signalr/negotiate?clientProtocol=2.1&connectionData=' from origin 'localhost:20700' has been blocked by CORS policy: No 'Access-Control-Allow -Origin' 标头存在于请求的资源上。”错误。有什么想法吗?
    • @RobMcCabe 我添加了更新。
    【解决方案2】:

    在您的 startup.cs 上:

    using Microsoft.Owin.Cors;
    using Microsoft.AspNet.SignalR;
    

    ...

    //Branch the pipeline for requests that start with "/signalr"
    app.Map("/signalr", map =>
    {
        map.UseCors(CorsOptions.AllowAll);
        var hubConfiguration = new HubConfiguration { };
        hubConfiguration.EnableDetailedErrors = true;
        map.RunSignalR(hubConfiguration);
    });
    

    【讨论】:

      【解决方案3】:

      在您的 web.config 文件中 改变 添加名称="访问控制允许来源"值="http://localhost:20700" 到 添加名称="Access-Control-Allow-Origin" 值="*"

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-30
        • 2021-06-17
        • 2016-01-11
        • 1970-01-01
        • 1970-01-01
        • 2016-09-30
        • 2015-08-17
        相关资源
        最近更新 更多