【问题标题】:Access-Control-Allow-Origin appearing twice on header request ASP.NET Web APIAccess-Control-Allow-Origin 在标头请求 ASP.NET Web API 上出现两次
【发布时间】:2018-04-16 13:43:45
【问题描述】:

我的 ASP.NET Web API 控制器之一。我的客户端应用程序返回以下错误:

对预检请求的响应未通过访问控制检查: 'Access-Control-Allow-Origin' 标头包含多个值 '*, *', 但只允许一个。因此,原点 'http://localhost:8100' 是 不允许访问。

我知道发生此错误是因为标头包含多个值。当通过 Chrome 调用 API 时,我可以在“响应标头”中看到这一点,如下所示:

HTTP/1.1 200 正常

缓存控制:无缓存

内容长度:0

服务器:Microsoft-IIS/8.0

访问控制允许方法:GET、POST

访问控制允许来源:*

Access-Control-Allow-Headers:Content-Type、Accept、Pragma、 缓存控制、授权

访问控制最大年龄:1728000

X-Powered-By:ASP.NET

访问控制允许来源:*

访问控制允许方法:GET、POST、OPTIONS、PUT、DELETE

Access-Control-Allow-Headers:Origin、X-Requested-With、Content-Type、 接受,授权

设置 Cookie: ARRAffinity=ef9b3770b61f10f9696b0dedcb39a7f47a83c0e4d6cdbf367f3149482592ef06;Path=/;HttpOnly;Domain=seirse.azurewebsites.net

如您所见,它显然出现了两次。

我遇到的问题是我启用 CORS 的唯一地方是通过我的应用程序中的 web.config,例如

<httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT, DELETE" />
        <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept, Authorization" />
      </customHeaders>
    </httpProtocol>

我已经 100% 确定我没有通过 Startup.cs 或在控制器中启用 CORS。

据我所见,控制器没有任何异常:

// GET: api/Address/all
[HttpGet]
public AddressResultModel All()
{
    try
    {
        var userId = _accountService.GetUserId(Request);
        return _customerRepository.GetAddresses(userId);
    }
    catch (Exception)
    {
        return null;
    }
}

任何想法可能是什么问题?

【问题讨论】:

  • 如果在&lt;customHeaders&gt; 元素的顶部添加&lt;clear /&gt; 会发生什么?
  • 它仍然没有工作,但是你让我意识到我在 Global.asax.cs 的 Application_BeginRequest 方法中有一些 CORS 配置值。我对此进行了评论,并且更进一步 - 现在为 OPTIONS 方法获取“405 方法不允许”。谢谢你,我现在走得更远了!

标签: c# asp.net asp.net-mvc asp.net-web-api cors


【解决方案1】:

原来我的 Global.asax.cs 中有代码,它为 OPTIONS HTTP 请求的响应添加了标头。

我添加此代码的原因是由于另一个问题,即我收到 OPTIONS HTTP 请求的“405 Method Not Allowed”错误消息。

为了解决这两个问题,我删除了添加额外标题的代码并将其修剪为:

protected void Application_BeginRequest()
{
    if (Request.Headers.AllKeys.Contains("Origin", StringComparer.CurrentCultureIgnoreCase)
        && Request.HttpMethod == "OPTIONS")
    {
        Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept, Pragma, Cache-Control, Authorization ");
        Response.End();
    }
}

我不确定为什么这解决了问题。

【讨论】:

    猜你喜欢
    • 2020-11-06
    • 2021-04-13
    • 2015-02-14
    • 1970-01-01
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-03
    相关资源
    最近更新 更多