多行策略表达式中缺少“”

Posted

技术标签:

【中文标题】多行策略表达式中缺少“”【英文标题】:missing '' in multiline policy expression多行策略表达式中缺少“” 【发布时间】:2019-11-04 22:05:13 【问题描述】:

我正在尝试通过 ARM 模板部署 APIM 策略文件并收到以下错误:

第 24 行第 6 列的元素 'set-variable' 出错:代码块缺少结束 \\"\\" 字符。确保此块中的所有 \\"\\" 字符都有一个匹配的 \\"\\" 字符,并且没有任何 \\"\\" 字符被解释为标记。 em>

我最初通过 Azure 门户中的 APIM 管理刀片创建了此策略,相关策略在此处如下所示:

<set-variable name="digitalSignature" value="@
  string privateKey = context.Variables.GetValueOrDefault<string>("privateKey", "");
  Encoding encoding = System.Text.Encoding.ASCII;
  string usablePrivateKey = privateKey.Replace("-", "+").Replace("_", "/");
  byte[] privateKeyBytes = Convert.FromBase64String(usablePrivateKey);
  byte[] encodedPathAndQueryBytes = encoding.GetBytes(context.Request.Url.Path + context.Request.Url.QueryString);
  HMACSHA1 hashAlgorithm = new HMACSHA1(privateKeyBytes);
  byte[] hash = hashAlgorithm.ComputeHash(encodedPathAndQueryBytes);
  string digitalSignature = Convert.ToBase64String(hash).Replace("+", "-").Replace("/", "_");

  return digitalSignature;
" />

但是,该表达式包含许多不是有效 XML 的字符,因此我在 *.policy.xml 文件中将上述代码转义如下:

<set-variable name="digitalSignature" value="@
  string privateKey = context.Variables.GetValueOrDefault&lt;string&gt;(&quot;privateKey&quot;, &quot;&quot;);
  Encoding encoding = System.Text.Encoding.ASCII;
  string usablePrivateKey = privateKey.Replace(&quot;-&quot;, &quot;+&quot;).Replace(&quot;_&quot;, &quot;/&quot;);
  byte[] privateKeyBytes = Convert.FromBase64String(usablePrivateKey);
  byte[] encodedPathAndQueryBytes = encoding.GetBytes(context.Request.Url.Path + context.Request.Url.QueryString);
  HMACSHA1 hashAlgorithm = new HMACSHA1(privateKeyBytes);
  byte[] hash = hashAlgorithm.ComputeHash(encodedPathAndQueryBytes);
  string digitalSignature = Convert.ToBase64String(hash).Replace(&quot;+&quot;, &quot;-&quot;).Replace(&quot;/&quot;, &quot;_&quot;);

  return digitalSignature;
" />

我错过了什么?由于支持 APIM 实例的 GIT 存储库中的策略 XML 文件没有转义,我什至需要转义字符吗?

【问题讨论】:

【参考方案1】:

在进行更改以使其正常工作时,我删除了代码表达式中的所有 cmets(未在此问题中发布)以删除任何非明确必要且似乎已解决问题的内容。

查看 cmets,我看不出是什么导致了问题,因为所有特殊字符都被转义(并使用几个不同的 XML 转义实用程序进行了验证),但由于 cmets 不是必需的,而且这是有效的,我认为问题已解决。

【讨论】:

Thanks 也被 cmets 在策略代码中击中。发现在块 cmets 中包含 cmets 也可以/* such comments are working */

以上是关于多行策略表达式中缺少“”的主要内容,如果未能解决你的问题,请参考以下文章

如何在正则表达式中匹配多行中的任何字符?

对齐多行“胶水”表达式

Ruby多行三元表达式?

简单的多行正则表达式在 .NET 中失败,但在 ECMAScript 中成功 - 为啥?

Perl 正则表达式多行匹配没有点

正则表达式选择多行字符串中的最后一行