带有 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 8
的ASP.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.asax
或 Startup.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 在线聊天室 获取保存用户信息)