如何在 Azure API 管理 (C#) 策略表达式中应用 HTML 解码?
How can I apply HTML decoding in an Azure API Management (C#) policy expression?
我在 HTTP POST 正文中有有效载荷,我需要在转发到后端之前对特定字段应用 HTML 解码。如何在 API 管理策略表达式中实现此目的 System.Web.HttpUtility.HtmlDecode 似乎不可用 - also see feedback forum?
尝试使用自制版本失败,因为策略编辑器将 ä
转换为 ä
:
<set-body>@{
string HtmlDecode(string input) => input.Replace("ä","ä");
var body = context.Request.Body.As<JObject>(true);
body["field1"] = HtmlDecode(body["field1"].ToString());
return body.ToString();
}</set-body>
不是我的首选和预期的解决方案,但在@Dana 和 Maxim Kim(API 管理团队)的帮助下,一个解决方法:
<set-body>@{
Dictionary<string,string> decoderPairs = new Dictionary<string,string>()
{
{"&auml;","ä"},
{"&ouml;","ö"},
{"&uuml;","ü"},
{"&Auml;","Ä"},
{"&Ouml;","Ö"},
{"&Uuml;","Ü"},
{"&szlig;","ß"},
{"&amp;","&"}
};
string HtmlDecode(string input) { foreach(var p in decoderPairs) { input = input.Replace(p.Key,p.Value); } return input; }
var body = context.Request.Body.As<JObject>(true);
body["field1"] = HtmlDecode((body["field1"] ?? "").ToString());
return body.ToString();
}</set-body>
编辑
自此 release 有合适的解决方案可用
<set-body>@{
var body = context.Request.Body.As<JObject>(true);
body["field1"] = System.Net.WebUtility.HtmlDecode((body["field1"] ?? "").ToString());
return body.ToString();
}</set-body>
由于 API 管理策略表达式支持 XDocument,您可以使用它来解码大多数 html/xml 数据块:
string DecodeHtml(string value) { if (value == null) return null; return XDocument.Parse($"<root>{value}</root>").Root.Value; }
现在您甚至不必使用 c# 来解码您的 HTML 转义字符串。直接使用System.Net.WebUtility.HtmlDecode即可:
<set-body>@(System.Net.WebUtility.HtmlDecode(escaped_string))</set-body>
我在 HTTP POST 正文中有有效载荷,我需要在转发到后端之前对特定字段应用 HTML 解码。如何在 API 管理策略表达式中实现此目的 System.Web.HttpUtility.HtmlDecode 似乎不可用 - also see feedback forum?
尝试使用自制版本失败,因为策略编辑器将 ä
转换为 ä
:
<set-body>@{
string HtmlDecode(string input) => input.Replace("ä","ä");
var body = context.Request.Body.As<JObject>(true);
body["field1"] = HtmlDecode(body["field1"].ToString());
return body.ToString();
}</set-body>
不是我的首选和预期的解决方案,但在@Dana 和 Maxim Kim(API 管理团队)的帮助下,一个解决方法:
<set-body>@{
Dictionary<string,string> decoderPairs = new Dictionary<string,string>()
{
{"&auml;","ä"},
{"&ouml;","ö"},
{"&uuml;","ü"},
{"&Auml;","Ä"},
{"&Ouml;","Ö"},
{"&Uuml;","Ü"},
{"&szlig;","ß"},
{"&amp;","&"}
};
string HtmlDecode(string input) { foreach(var p in decoderPairs) { input = input.Replace(p.Key,p.Value); } return input; }
var body = context.Request.Body.As<JObject>(true);
body["field1"] = HtmlDecode((body["field1"] ?? "").ToString());
return body.ToString();
}</set-body>
编辑
自此 release 有合适的解决方案可用
<set-body>@{
var body = context.Request.Body.As<JObject>(true);
body["field1"] = System.Net.WebUtility.HtmlDecode((body["field1"] ?? "").ToString());
return body.ToString();
}</set-body>
由于 API 管理策略表达式支持 XDocument,您可以使用它来解码大多数 html/xml 数据块:
string DecodeHtml(string value) { if (value == null) return null; return XDocument.Parse($"<root>{value}</root>").Root.Value; }
现在您甚至不必使用 c# 来解码您的 HTML 转义字符串。直接使用System.Net.WebUtility.HtmlDecode即可:
<set-body>@(System.Net.WebUtility.HtmlDecode(escaped_string))</set-body>