如何在Azure API管理(C#)策略表达式中应用HTML解码?

时间:2018-10-02 15:37:35

标签: c# azure-api-management

我在HTTP POST正文中有有效负载,在转发到后端之前,需要在特定字段上应用HTML解码。我该如何在System.Web.HttpUtility.HtmlDecode - also see feedback forum似乎不可用的API管理策略表达式中实现这一目标?

尝试使用自制版本失败,因为策略编辑器将ä转换为ä

<set-body>@{
    string HtmlDecode(string input) => input.Replace("&auml;","ä");
    var body = context.Request.Body.As<JObject>(true);
    body["field1"] = HtmlDecode(body["field1"].ToString());
    return body.ToString();
}</set-body>

3 个答案:

答案 0 :(得分:1)

现在,您甚至不必使用c#来解码HTML转义的字符串。只需直接使用System.Net.WebUtility.HtmlDecode:

<set-body>@(System.Net.WebUtility.HtmlDecode(escaped_string))</set-body>

答案 1 :(得分:0)

不是我的首选解决方案,但在@Dana和Maxim Kim(API管理团队)的帮助下,一种解决方法:

<set-body>@{
    Dictionary<string,string> decoderPairs = new Dictionary<string,string>() 
    {
        {"&amp;auml;","ä"},
        {"&amp;ouml;","ö"},
        {"&amp;uuml;","ü"},
        {"&amp;Auml;","Ä"},
        {"&amp;Ouml;","Ö"},
        {"&amp;Uuml;","Ü"},
        {"&amp;szlig;","ß"},
        {"&amp;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>

答案 2 :(得分:0)

由于API管理策略表达式支持XDocument,因此您可以使用它来解码大多数html / xml数据块:

string DecodeHtml(string value) { if (value == null) return null; return XDocument.Parse($"<root>{value}</root>").Root.Value; }