使用Bicep+OpenAPI创建API并配置操作级XML策略遇BCP170错误求助
问题解决与需求实现方案
错误原因解析
你遇到的BCP170错误,是因为在使用parent属性关联父资源(这里是apiService)时,子资源的name字段不能包含全路径(带斜杠的层级结构)。原代码里的name: '${apimName}/api/operations/operationNamefromOpenAPIspec/policy'包含了父资源的完整路径,违反了Bicep的资源命名规则。
修正后的实现方案
完全可以通过Bicep实现导入OpenAPI规范创建API,并为不同操作绑定差异化XML策略的需求。以下是修正后的代码及说明:
修正后的Bicep代码
param apiName string = 'reallycool-api-dev' param apimName string = 'apim-coolness-01' // 引用已存在的APIM服务实例 resource apimServiceResource 'Microsoft.ApiManagement/service@2022-04-01-preview' existing = { name: apimName } // 从OpenAPI规范创建API resource apiService 'Microsoft.ApiManagement/service/apis@2023-05-01-preview' = { name: apiName parent: apimServiceResource properties: { displayName: 'ReallyCool-API-dev' isCurrent: true description: 'ReallyCool API-dev' protocols: ['https'] subscriptionRequired: true format: 'openapi+json' value: loadTextContent('OpenAPI ReallyCoolAPI.json') path: 'reallycool/dev' subscriptionKeyParameterNames: { header: 'Ocp-Apim-Subscription-Key' query: 'subscription-key' } } } // 为第一个操作绑定XML策略(替换为你OpenAPI中实际的operationId) resource firstOperationPolicy 'Microsoft.ApiManagement/service/apis/operations/policies@2022-09-01-preview' = { name: 'operationNamefromOpenAPIspec/policy' // 仅需指定操作ID + policy,无需全路径 parent: apiService properties: { format: 'rawxml' value: loadTextContent('TestPolicy.xml') } } // 示例:为第二个操作绑定不同的XML策略 resource secondOperationPolicy 'Microsoft.ApiManagement/service/apis/operations/policies@2022-09-01-preview' = { name: 'anotherOperationIdFromOpenAPI/policy' parent: apiService properties: { format: 'rawxml' value: loadTextContent('AnotherTestPolicy.xml') } }
关键说明
- 资源命名规则:当通过
parent属性关联父资源时,子资源的name只需提供当前层级的名称组合。对于操作策略资源,格式为{operationId}/policy,其中operationId是你OpenAPI规范中定义的操作ID。 - 多操作策略配置:如果需要为多个操作设置不同策略,只需重复定义策略资源块,替换对应的
operationId和XML策略文件路径即可。 - 操作ID匹配:确保使用的
operationId与OpenAPI规范中定义的完全一致,APIM在导入OpenAPI时会直接沿用这些ID作为操作的唯一标识。
内容的提问来源于stack exchange,提问作者Richard
相关产品推荐
相关产品推荐

