我有以下二头肌模块:
// fails if set-backend-service and set-body are used together
// var apiOperationPolicy = format('''
// <policies>
// <inbound>
// <base />
// <rewrite-uri template="/" />
// <set-backend-service base-url="{0}" />
// <set-body>
// <value>@{
// var body = context.Request.Body.As<JObject>();
// body["source"] = body["operation"];
// return body.ToString();
// }</value>
// </set-body>
// </inbound>
// <backend>
// <base />
// </backend>
// <outbound>
// <base />
// </outbound>
// <on-error>
// <base />
// </on-error>
// </policies>
// ''', formattedBasePath)
//works if only set-body
// var apiOperationPolicy = '''
// <policies>
// <inbound>
// <base />
// <rewrite-uri template="/" />
// <set-body>
// <value>@{
// var body = context.Request.Body.As<JObject>();
// body["source"] = body["operation"];
// return body.ToString();
// }</value>
// </set-body>
// </inbound>
// <backend>
// <base />
// </backend>
// <outbound>
// <base />
// </outbound>
// <on-error>
// <base />
// </on-error>
// </policies>
// '''
//works if only set-backend-service is used
var apiOperationPolicy = format('''
<policies>
<inbound>
<base />
<rewrite-uri template="/" />
<set-backend-service base-url="{0}" />
</inbound>
<backend>
<base />
</backend>
<outbound>
<base />
</outbound>
<on-error>
<base />
</on-error>
</policies>
''', formattedBasePath)
resource apiOperationPolicyResource 'Microsoft.ApiManagement/service/apis/operations/policies@2022-04-01-preview' = {
parent: apiOperation
name: 'policy'
properties: {
value: apiOperationPolicy
format: 'rawxml'
}
}
如果我尝试设置这两个策略,则会收到以下错误:
错误:InvalidTemplate - 部署模板验证失败:“模板变量“apiOperationPolicy”无效:无法评估语言函数“格式”:格式无效:“输入字符串的格式不正确。”
有谁知道这是什么原因吗?
错误:InvalidTemplate - 部署模板验证失败:“模板变量“apiOperationPolicy”无效:无法评估语言函数“格式”:格式无效:“输入字符串的格式不正确。”
我之前在我的环境中尝试时也收到了同样的错误。我使用以下解决方法来解决该问题并按预期工作。
基本上,您使用的占位符的目的是。部署后,它将被格式化的基本路径 URL 替换。因此,不要使用
{0}
作为占位符,而是尝试使用名为 _base_url_
的占位符来避免输入格式的冲突,因为当 bicep 读取 XML 的多行结构时,有可能出现解析错误。
通过
_base_url_
后,使用策略中可用的 replace()
函数将占位符替换为存储在格式化基本路径中的实际 URL。
param formattedBasePath string = 'https://google.com'
var apiOperationPolicy = '''
<policies>
<inbound>
<base />
<rewrite-uri template="/" />
<set-backend-service base-url="_base_url_" />
<set-body>
<value>@{
var body = context.Request.Body.As<JObject>();
body["source"] = body["operation"];
return body.ToString();
}</value>
</set-body>
</inbound>
<backend>
<base />
</backend>
<outbound>
<base />
</outbound>
<on-error>
<base />
</on-error>
</policies>
'''
使用replace()函数:
var replacepolicy = replace(apiOperationPolicy, '_base_url_', formattedBasePath)
resource apiManagementService 'Microsoft.ApiManagement/service@2023-05-01-preview' existing = {
name: 'newapimjah'
}
resource api 'Microsoft.ApiManagement/service/apis@2020-12-01' existing = {
parent: apiManagementService
name:'apinewjah'
}
resource apiOperation 'Microsoft.ApiManagement/service/apis/operations@2023-09-01-preview' existing = {
name: 'firstop'
parent: api
}
resource apiOperationPolicyResource 'Microsoft.ApiManagement/service/apis/operations/policies@2022-04-01-preview' = {
parent: apiOperation
name: 'policy'
properties: {
value: replacepolicy
format: 'rawxml'
}
}
部署成功: