我有 2 个 Azure 网站(ASP.NET MVC 5 和 ASP.NET WebApi 2)。 MVC 网站有一些 jQuery 尝试将 CORS 请求发布到 WebApi。如果直接连接到 WebApi,它就可以正常工作。但是,当尝试通过 API 管理连接时,它不起作用。
我在 Chrome 中遇到的错误是:
XMLHttpRequest 无法加载 https://XXXXXX.azure-api.net/api/search。对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许访问来源“https://YYYYYY.azurewebsites.net”。
我排除了 WebApi 配置的问题,因为正如我所说,它可以直接工作。
以下是我的政策:
<policies>
<inbound>
<cors>
<allowed-origins>
<origin>*</origin>
<!-- allow any -->
</allowed-origins>
<allowed-headers>
<header>accept</header>
<header>accept-encoding</header>
<header>access-control-request-headers</header>
<header>access-control-request-method</header>
<header>connection</header>
<header>content-type</header>
<header>host</header>
<header>origin</header>
<header>referer</header>
<header>user-agent</header>
</allowed-headers>
<expose-headers>
<header>access-control-allow-headers</header>
<header>access-control-allow-origin</header>
<header>cache-control</header>
<header>content-length</header>
<header>date</header>
<header>expires</header>
<header>pragma</header>
<header>server</header>
<header>set-cookie</header>
<header>x-aspnet-version</header>
<header>x-powered-by</header>
</expose-headers>
</cors>
</inbound>
<backend>
<base />
</backend>
<outbound>
<base />
</outbound>
</policies>
有什么想法吗?
CORS 策略的预期用途是当您的后端不支持 CORS 的情况。在这种情况下,您可以放入此策略,它将回复 OPTION 请求,而不将它们转发到您的后端。您可以使用此策略来决定处理 CORS 的来源/标头/方法。
或者,如果您的后端已经支持 CORS,并且您认为在 APIM 级别处理 CORS 流没有任何好处,您可以只代理整个流。为此,您应该删除 CORS 策略,并使用 OPTIONS 方法在 APIM 中的 API 中创建一个新操作,以便 OPTIONS 请求正常转发到后端。
在花了数周时间解决这个问题并一无所获之后,我(在 Microsoft 支持的帮助下)发现了 Azure API 管理中的一个错误。如果您有多个 API,并且其中一个没有 URL 后缀(即使它不是失败的 API),请检查其 CORS 策略。我们放入 Azure API 管理中的第一个 API 除了 GET 之外没有任何方法,因此我们设置 CORS 策略仅允许 GET 和 OPTION。然而,存在的错误似乎使所有入站飞行前请求路由到没有 URL 后缀的 API。因此,我能够通过向不相关 API 的 CORS 策略添加 PUT(以及 POST,以达到良好的措施)来解决我的问题。
TL;DR:检查以确保没有 URL 后缀的 API 的 CORS 策略允许失败的方法。
希望这可以挽救某人的理智。