带有 SignalR 的 ASP.Net MVC 中的 CORS 导致“Access-Control-Allow-Origin”错误

Posted

技术标签:

【中文标题】带有 SignalR 的 ASP.Net MVC 中的 CORS 导致“Access-Control-Allow-Origin”错误【英文标题】:CORS in ASP.Net MVC with SignalR causes "Access-Control-Allow-Origin" error 【发布时间】: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>

【问题讨论】:

【参考方案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" 值="*"

【讨论】:

以上是关于带有 SignalR 的 ASP.Net MVC 中的 CORS 导致“Access-Control-Allow-Origin”错误的主要内容,如果未能解决你的问题,请参考以下文章

asp.net MVC SignalR 与数据库 实时同步显示

用于asp.net MVC聊天应用程序的signalR vs html5 websockets

如何使用 SignalR 从 ASP.NET MVC 3 通知 Web 客户端 MSMQ 任务已完成

Asp.NET MVC 使用 SignalR 实现推送功能二(Hubs 在线聊天室 获取保存用户信息)

在ASP.NET MVC中使用NuGet添加SignalR类库之后,再次运行程序时,它出现了一个异常:

有关于MVC SignalR的问题