繁体   English   中英

MVC web api:请求的资源上不存在“Access-Control-Allow-Origin”标头

[英]MVC web api: No 'Access-Control-Allow-Origin' header is present on the requested resource

我尝试了本文中写的所有内容: http : //www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api ,但没有任何效果。 我正在尝试从 webAPI2 (MVC5) 获取数据以使用 angularJS 在另一个域中使用。

我的控制器看起来像这样:

namespace tapuzWebAPI.Controllers
{
    [EnableCors(origins: "http://local.tapuz.co.il", headers: "*", methods: "*", SupportsCredentials = true)]
    [RoutePrefix("api/homepage")]
    public class HomePageController : ApiController
    {
        [HttpGet]
        [Route("GetMainItems")]
        //[ResponseType(typeof(Product))]
        public List<usp_MobileSelectTopSecondaryItemsByCategoryResult> GetMainItems()
        {


            HomePageDALcs dal = new HomePageDALcs();
            //Three product added to display the data

            //HomePagePromotedItems.Value.Add(new HomePagePromotedItem.Value.FirstOrDefault((p) => p.ID == id));


            List<usp_MobileSelectTopSecondaryItemsByCategoryResult> items = dal.MobileSelectTopSecondaryItemsByCategory(3, 5);
            return items;

        }      
    }
}

您需要在Web Api 中启用CORS 全局启用 CORS 的更简单和首选的方法是将以下内容添加到web.config

<system.webServer>
  <httpProtocol>
    <customHeaders>
      <add name="Access-Control-Allow-Origin" value="*" />
      <add name="Access-Control-Allow-Headers" value="Content-Type" />
      <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
    </customHeaders>
  </httpProtocol>
</system.webServer>

请注意,方法都是单独指定的,而不是使用* 这是因为在使用*时发生了错误。

您还可以通过代码启用CORS

更新
需要以下NuGet包: Microsoft.AspNet.WebApi.Cors

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.EnableCors();

        // ...
    }
}

然后你可以像这样在动作或控制器上使用[EnableCors]属性

[EnableCors(origins: "http://www.example.com", headers: "*", methods: "*")]

或者你可以全局注册

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        var cors = new EnableCorsAttribute("http://www.example.com", "*", "*");
        config.EnableCors(cors);

        // ...
    }
}

您还需要办理预检Options请求HTTP OPTIONS请求。

Web API需要响应Options请求,以确认它确实配置为支持CORS

要处理这个问题,您需要做的就是发回一个空响应 您可以在您的操作中执行此操作,也可以像这样全局执行此操作:

# Global.asax.cs
protected void Application_BeginRequest()
{
    if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
    {
        Response.Flush();
    }
}

添加此额外检查是为了确保设计为仅接受GETPOST请求的旧APIs不会被利用。 想象一下,当这个动词不存在时,向一个设计的API发送一个DELETE请求。 结果是不可预测的,结果可能是危险的

@Mihai-Andrei Dinculescu 的回答是正确的,但为了搜索者的利益,还有一个微妙的地方可能会导致此错误。

在 URL 末尾添加“/”将阻止 EnableCors 在所有情况下(例如从主页)工作。

即这行不通

var cors = new EnableCorsAttribute("http://testing.azurewebsites.net/", "*", "*");
config.EnableCors(cors);

但这会起作用:

var cors = new EnableCorsAttribute("http://testing.azurewebsites.net", "*", "*");
config.EnableCors(cors);

如果使用 EnableCors 属性,效果相同。

我遵循了Mihai-Andrei Dinculescu指出的所有步骤。
但就我而言,我还需要1 个步骤,因为 http OPTIONS 在 Web.Config 中被以下行禁用。

<remove name="OPTIONSVerbHandler" />

我刚刚从 Web.Config 中删除了它(只需像下面一样评论它),Cors 就像一个魅力

<handlers>
  <!-- remove name="OPTIONSVerbHandler" / -->
</handlers>

可能是因为安装了 Cors nuget 包。

如果您在从 nuget 安装和启用 cors 后遇到问题,那么您可以尝试重新安装 web Api。

在包管理器中,运行Update-Package Microsoft.AspNet.WebApi -reinstall

试试这个,以确保你正确配置了 CORS:

[EnableCors(origins: "*", headers: "*", methods: "*")]

还是行不通? 检查 HTTP 标头是否存在。

我知道我来得很晚。 但是,对于正在搜索的任何人,我想我会发布最终对我有用的内容。 我并不是说这是最好的解决方案——只是说它有效。

我们的 WebApi 服务使用 config.EnableCors(corsAttribute) 方法。 然而,即便如此,它仍然会在飞行前请求上失败。 @Mihai-Andrei Dinculescu 的回答为我提供了线索。 首先,我添加了他的 Application_BeginRequest() 代码来刷新选项请求。 那仍然对我不起作用。 问题是 WebAPI 仍然没有向 OPTIONS 请求添加任何预期的标头。 单独冲洗它没有用 - 但它给了我一个想法。 我添加了自定义标头,否则这些标头将通过 web.config 添加到 OPTIONS 请求的响应中。 这是我的代码:

protected void Application_BeginRequest()
{
  if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
  {
    Response.Headers.Add("Access-Control-Allow-Origin", "https://localhost:44343");
    Response.Headers.Add("Access-Control-Allow-Headers",
      "Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");
    Response.Headers.Add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
    Response.Headers.Add("Access-Control-Allow-Credentials", "true");
    Response.Flush();
  }
}

显然,这仅适用于 OPTIONS 请求。 所有其他动词都由 CORS 配置处理。 如果有更好的方法来解决这个问题,我会全力以赴。 对我来说这感觉像是作弊,我更喜欢自动添加标题,但这最终奏效并让我继续前进。

要使任何 CORS 协议工作,您需要在每个端点(或具有此方法的全局过滤器)上都有一个 OPTIONS 方法,该方法将返回这些标头:

Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: content-type

原因是浏览器将首先发送一个 OPTIONS 请求来“测试”您的服务器并查看授权

我抓住了关于 cors 的下一个案例。 也许这对某人有用。 如果您将功能“WebDav 重定向器”添加到您的服务器,PUT 和 DELETE 请求将失败。

因此,您需要从 IIS 服务器中删除“WebDAVModule”:

  • “在 IIS 模块配置中,循环 WebDAVModule,如果您的 Web 服务器有它,则将其删除”。

或添加到您的配置:

<system.webServer>
<modules>
  <remove name="WebDAVModule"/>
</modules>
<handlers>
  <remove name="WebDAV" />
  ...
</handlers>

当您尝试从不同的域或不同的端口访问时,就会发生该问题。

如果您使用的是 Visual Studio,请转到“工具”>“NuGet 包管理器”>“包管理器控制台”。 在那里你必须安装 NuGet 包Microsoft.AspNet.WebApi.Cors

Install-Package Microsoft.AspNet.WebApi.Cors

然后,在 PROJECT > App_Start > WebApiConfig 中,启用 CORS

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        
        //Enable CORS. Note that the domain doesn't have / in the end.
        config.EnableCors(new EnableCorsAttribute("https://tiagoperes.eu",headers:"*",methods:"*"));

        ....

    }
}

成功安装后,构建解决方案就足够了

@Mihai-Andrei Dinculescu 的回答对我有用,例如:

  • 在 web.config 的<system.webServer>部分添加一个<httpProtocol>
  • 通过global.asax提到的Application_BeginRequest()OPTIONS请求返回空响应

除了他对Request.Headers.AllKeys.Contains("Origin")检查对我不起作用,因为请求包含origing ,所以使用小写。 我认为我的浏览器(Chrome)会像这样为 CORS 请求发送它。

我通过使用他的Contains检查的不区分大小写的变体来更通用地解决这个问题: if (culture.CompareInfo.IndexOf(string.Join(",", Request.Headers.AllKeys), "Origin", CompareOptions.IgnoreCase) >= 0) {

如果您的 web.config 中有 security\\requestFiltering 节点,如下所示:

<security>
  <requestFiltering>
    <verbs allowUnlisted="false">
      <add verb="GET" allowed="true" />
      <add verb="POST" allowed="true" />
      <add verb="PUT" allowed="true" />
      <add verb="DELETE" allowed="true" />
      <add verb="DEBUG" allowed="true" />          
    </verbs>
  </requestFiltering>

确保你也添加这个

<add verb="OPTIONS" allowed="true" />

我已经尝试了所有可以在网上找到的方法,包括在这个答案中给出的方法。 在几乎尝试解决问题一整天之后,我找到了对我有用的解决方案。

在文件夹App_Start中的文件WebApiConfig中,注释所有代码行并添加以下代码:

`public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services
        config.EnableCors();
        var enableCorsAttribute = new EnableCorsAttribute("*",
                                           "Origin, Content-Type, Accept",
                                           "GET, PUT, POST, DELETE, OPTIONS");
        config.EnableCors(enableCorsAttribute);
        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            //routeTemplate: "api/{controller}/{id}",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
        config.Formatters.Add(new BrowserJsonFormatter());
    }

    public class BrowserJsonFormatter : JsonMediaTypeFormatter
    {
        public BrowserJsonFormatter()
        {
            this.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
            this.SerializerSettings.Formatting = Formatting.Indented;
        }

        public override void SetDefaultContentHeaders(Type type, HttpContentHeaders headers, MediaTypeHeaderValue mediaType)
        {
            base.SetDefaultContentHeaders(type, headers, mediaType);
            headers.ContentType = new MediaTypeHeaderValue("application/json");
        }
    }`

我知道人们一开始可能会觉得这很明显,但仔细想想。 如果您做错了什么,这通常会发生。

例如,我遇到了这个问题,因为我没有在我的主机文件中添加主机条目。 真正的问题是 DNS 解析。 或者我只是把基本 URL 弄错了。

如果身份令牌来自一台服务器,有时我会收到此错误,但我正在尝试在另一台服务器上使用它。

有时,如果您的资源有误,您会收到此错误。

如果您将 CORS 中间件放入链中太晚,您可能会得到这个。

避免多处启用 CORS,如 WebApiCOnfig.cs、提供者中的 GrantResourceOwnerCredentials 方法和 Controller Header 属性等。以下是导致访问控制允许来源的列表

  1. 与您使用的数据库交互的网络有问题。
  2. AWS Cloud 如果 Web API 和 DB 的 VPC 不同。

下面的代码足以修复访问控制允许来源。 //确保 app.UseCors 应该是配置代码行的顶部。

   public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
            //All other configurations
        }
    }

这减缓了我的问题。

安装包:Microsoft.AspNet.WebApi.Cors

转到:App_Start --> WebApiConfig

添加 :

var cors = new EnableCorsAttribute("http://localhost:4200", " ", " "); config.EnableCors(cors);

注意:如果您添加“/”作为特定 url 的结尾对我不起作用。

对于那些只是在 .NET 5 中创建 Web API 而不是 Web 应用程序的人,在Startup.cs您需要像这样配置您的策略:

public void ConfigureServices(IServiceCollection services)
{
    // Additional configs above...
    services.AddCors(options =>
    {
        options.AddPolicy("AllowAnyOrigin", builder =>
        {
            // Allow "Access-Control-Allow-Origin: *" header
            builder.AllowAnyOrigin();
        });
    });
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // Add this above other config options...
    app.UseCors("AllowAnyOrigin");
}

我知道这听起来很疯狂,但对我来说是 [HttpPost()] 而不是 [HttpPost]。 当我删除多余的括号时,它开始工作

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM