.Net 5 API添加Access-Control-Allow-Origin响应头报错如何解决?
异常修复方案
问题根因
.NET 5 对HTTP头的所属类型校验比.NET Framework严格很多,Access-Control-Allow-Origin、Access-Control-Allow-Headers属于响应级别的通用头,不属于响应内容(HttpContent)的专属头,所以不能添加到response.Content.Headers中,必须添加到HttpResponseMessage本身的Headers集合里。
临时快速修复
直接修改加头的代码行即可,修改后的完整接口代码如下:
[HttpGet] [Route("api/Recommendations/GetRecommendations/{id}/{count}")] public HttpResponseMessage GetRecommendations(int id, int count) { var response = new HttpResponseMessage(); response.Content = new StringContent(_recommendationsAPIService.GetRecommendations(id, count)); response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); // 头添加位置从Content.Headers改为response.Headers response.Headers.Add("Access-Control-Allow-Origin", "*"); response.Headers.Add("Access-Control-Allow-Headers", "Content-Type, Accept, Referer, Authorization,Sec-Fetch-Mode,User-Agent"); return response; }
.NET 5 规范实现方案
.NET 5 已经内置了CORS跨域中间件,不需要手动在每个接口加响应头,统一配置更易维护:
- 第一步:在Program.cs中注册CORS服务
builder.Services.AddCors(options => { options.AddPolicy("AllowAllCors", policy => { policy.AllowAnyOrigin() .AllowAnyHeader() .AllowAnyMethod(); }); });
- 第二步:在中间件管道中启用CORS,需要放在路由中间件之后、认证授权中间件之前
app.UseRouting(); app.UseCors("AllowAllCors"); app.UseAuthorization();
- 第三步:移除接口中手动加头的代码,如果需要全局生效不用额外配置,如果只需要部分接口生效,给对应接口加
[EnableCors("AllowAllCors")]特性即可。
这些响应头的作用
你提到的两个头都是CORS(跨域资源共享)协议规定的响应头,用来突破浏览器的同源策略限制:
Access-Control-Allow-Origin: *:允许所有域名的前端页面跨域调用当前接口,不会被浏览器拦截Access-Control-Allow-Headers:规定前端发起跨域请求时允许携带的请求头列表,不在列表内的请求头会被浏览器自动拦截
原始开发人员加这些头,就是为了让部署在其他域名下的前端服务可以正常调用这个接口。
内容的提问来源于stack exchange,提问作者Frank-Medium
相关产品推荐
相关产品推荐

