从Azure API Management调用Azure Function出现CORS错误如何解决?
问题产生原因
- 现有CORS策略缺失预检请求必要配置:当前配置仅放开了跨域来源和请求方法,未配置允许的请求头。Blazor WASM发起的请求通常携带
Content-Type、Authorization等自定义头,预检(OPTIONS)请求会校验这些头是否被允许,未配置的情况下CORS策略不会生效,不会返回对应的跨域响应头。 - APIM未匹配OPTIONS请求的处理规则:多数用户创建API操作时仅添加GET/POST等业务方法,没有显式创建OPTIONS方法的映射,预检请求到达APIM后直接返回404/405错误,根本不会触发已配置的CORS策略,自然没有跨域响应头。
- CORS策略作用范围错误:如果将CORS策略配置在单个操作、错误的产品/API层级,目标接口请求无法命中CORS规则,也会导致跨域头缺失。
解决方案
步骤1:补全CORS策略配置
替换现有CORS配置为完整版本,测试阶段可先用通配符,生产环境建议收敛到实际用到的域名、头信息:
<policies> <inbound> <cors> <allowed-origins> <origin>*</origin> <!-- 生产环境建议替换为具体域名,例如 <origin>https://localhost:5001</origin> --> </allowed-origins> <allowed-methods> <method>*</method> <!-- 兼容低版本APIM可显式添加 <method>OPTIONS</method> --> </allowed-methods> <allowed-headers> <header>*</header> <!-- 可按需指定实际用到的头,例如 Content-Type、Authorization --> </allowed-headers> <expose-headers> <header>*</header> <!-- 前端需要读取自定义响应头时必须配置 --> </expose-headers> <!-- 请求需要携带凭证(JWT、Cookie)时添加下面配置,同时allowed-origins不能用通配符* --> <!-- <allow-credentials>true</allow-credentials> --> </cors> </inbound> <backend> <forward-request /> </backend> <outbound /> <on-error /> </policies>
步骤2:配置OPTIONS请求支持
二选一即可:
- 方案A:在目标API下手动添加OPTIONS操作,路径与业务接口(本例为
/teste/Teste)一致,无需配置后端转发,CORS策略会在入站阶段直接处理OPTIONS请求并返回响应。 - 方案B:如果全API都需要支持跨域,可在API的「所有操作」层级配置上述CORS策略,开启APIM的「自动处理OPTIONS预检请求」开关,无需逐个添加OPTIONS操作。
步骤3:确认策略作用范围
建议先将CORS策略配置在目标API的全局层级,而非单个操作或产品层级,确保所有该API下的请求都能命中CORS规则,验证通过后再按需缩小作用范围。
验证方法
执行curl命令发预检请求,查看返回头是否包含Access-Control-Allow-Origin即可确认是否生效:
curl -X OPTIONS https://example-api.azure-api.net/teste/Teste -H "Origin: https://localhost:5001" -H "Access-Control-Request-Method: GET" -v
内容的提问来源于stack exchange,提问作者Guilherme Molin
相关产品推荐
相关产品推荐

