在ASP.NET HTTP响应中设置CORS标头

时间:2020-05-21 06:33:31

标签: c# asp.net rest

我正在尝试为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中的程序包...

4 个答案:

答案 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

Cors Package

然后,您可以在三个级别上配置对Web API的CORS支持:

  1. 全球水平
  2. 控制器级别
  3. 操作级别

示例:

全局级别

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>
相关问题