我正在尝试为HTTP响应设置标头以包含CORS标头Access-Control-Allow-Origin
,以便Anguler.js Web应用程序可以轻松读取响应。
为此,我正在执行以下操作:
using System.Net;
using System.Net.Http;
using System.Web.Http;
namespace tecboxapi777.Controllers
{
public class WorkersController : ApiController
{
// GET: api/Worker
[Route("api/Workers")]
[HttpGet]
public HttpResponseMessage Get()
{
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created);
response.Headers.NAME_OF_THE_HEADER = "Access-Control-Allow-Origin";
}
}
}
如您所见,我找不到CORS标头的正确名称。我已经在网上搜索过,但发现的所有内容都与Access-Contro-Allow-Origin = "*"
相似,甚至无法编译。
我的问题是:我如何正确设置CORS标头,以便Angular.JS网络应用能够读取我的回复?
当前,每当我尝试向我的API发出GET请求时,Firefox的开发人员模式控制台都会返回以下消息:
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://192.168.0.6:45455/api/Workers. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing)
仅出于完整性考虑,执行GET请求的Angular.JS代码如下:
posts: Observable<any>;
getPosts(){
this.posts = this.http.get(this.ROOT_URL + '/api/Workers');
console.log(this.posts);
}
编辑:我接受了Sotiris Koukios-Panopoulos's answer,因为这是我解决问题的方法,并且不需要安装软件包。不过,Manish's answer是更好的答案,如果您关心什么被认为是标准的,则应该遵循它。
令我惊讶的是,即使向响应添加标头,所有内容都需要.NET中的程序包...
答案 0 :(得分:2)
您有两种方法可以做到这一点。
使用响应标头启用此功能,就像您最初尝试过的那样:
df3=data.frame(col1=c('A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B'),
col2b=c('a', 'a', 'd', 'd', 'c', 'c', 'b', 'b', 'b', 'e', 'e', 'e'),
col2a=c(1, 4, 1, 4, 1, 4, 3, 2, 5, 3, 2, 5))
进行全局配置,并在Controllers / Actions中有选择地使用它。
为此,您可以使用official docs中的指南,该指南可以比我更全面地对其进行解释
答案 1 :(得分:2)
使用Microsoft CORS软件包并安装NuGet软件包。
右键单击项目->管理NuGet软件包...
安装nuget软件包 Microsoft.AspNet.WebApi.Cors
然后,您可以在三个级别上配置对Web API的CORS支持:
示例:
全局级别
App_Start / WebApiConfig.cs文件
public static void Register(HttpConfiguration config)
{
EnableCorsAttribute cors = new EnableCorsAttribute("*", "*", "GET,POST");
config.EnableCors(cors);
}
控制器级别
using Microsoft.AspNet.WebApi.Cors
[EnableCors(origins: "*", headers: "*", methods: "*")]
public class TestController : ApiController
{
}
操作级别
public class TestController : ApiController
{
[EnableCors(origins: "*", headers: "*", methods: "*")]
// GET api/values
public IEnumerable<string> Get()
{
return new string[] { "value 1", "value 2" };
}
}
类似地,您也可以为特定操作禁用cors。假设您已在控制器级别启用了此功能,但想禁用其中的一些操作:
[DisableCors()]
// GET api/values/5
public string Get(int id)
{
return "value";
}
答案 2 :(得分:1)
首先安装Microsoft.AspNetCore.Cors Nuget软件包
然后在ConfigureService方法中配置CORS。
<iframe>
然后使用Configure方法中的中间件启用CORS。
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options => {
options.AddPolicy("AllowMyOrigin",
builder => builder.WithOrigins("http://example.com"));
});
}
通过在Controller或操作中或全局启用它在.NET Core MVC中启用CORS
启用操作方法
public void Configure(IApplicationBuilder app)
{
app.UseCors("AllowMyOrigin");
}
在api控制器上启用
[EnableCors("AllowMyOrigin")]
[Route("api/Workers")]
[HttpGet]
public HttpResponseMessage Get()
{
// You don't need the following now
// HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created);
// response.Headers.<NAME OF THE HEADER> = "Access-Control-Allow-Origin"
}
通过在startup.cs中添加以下内容来启用整个应用程序
[EnableCors("AllowMyOrigin")]
public class WorkersController : ApiController
答案 3 :(得分:0)
在web.config中添加以下代码行,它将解决您的问题
<system.webServer>
<httpProtocol>
<customHeaders>
<remove name="Access-Control-Allow-Origin" />
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="*" />
<add name="Access-Control-Allow-Methods" value="GET, POST,PUT,DELETE, OPTIONS" />
</customHeaders>
</httpProtocol>
</system.webServer>