是否可以从 azure api-management 策略 return 字节数组响应 body?

Is it possible to return a byte array response body from azure api-management policy?

我有一个 API,其中 return 是一个 JSON object,其中一个属性包含一些 base64 编码的二进制数据(PDF 文件)。我想在此 API 前面使用 Azure API 管理中的策略,因此响应 return 只是解码后的二进制数据。

我可以将二进制数据解码为字节数组,但是要 return 它我需要用该字节数组的内容更新响应 body(我已经设置了 content-type header 相应也)。 set-body 策略是我尝试使用的策略:

<set-body>@{
   var response = context.Response.Body.As<JObject>(true);
   string content = response.Value<string>("content");
   Byte[] bytes = Convert.FromBase64String(content);
   return bytes; // Can't do this!
}</set-body>

上面的方法不起作用,因为 set-body 的 return 类型必须是字符串。我无法将二进制数据转换为字符串,因为它会被 ASCII 编码损坏。我无法直接尝试将值分配给 context.Response.Body,因为它在策略中是 read-only。

有没有其他方法可以让 Azure API 管理在响应中 return 我的字节数组?

无论如何,响应都将是一个字符串,因此返回 base64 字符串肯定是一个选项,不是吗?

另一种选择是构建一个包含您的字节的十六进制字符串。例如“0xDEADBEEF”。

目前这是不可能的。您必须 return 字符串,它将使用 UTF8 编码放入消息中。这绝对是我们需要添加的内容。

现在完全可以像您写的那样:

<set-body template="none">@{
    var body = new JObject();
    body["Message"] = "SGVsbG8gV29ybGQ=";
    return Convert.FromBase64String(body["Message"].ToString());
}</set-body>

或不进行Base64转换:

<set-body template="none">@{
    var body = new JObject();
    body["Message"] = "Hello World";
    return Encoding.UTF8.GetBytes(body["Message"].ToString());
}</set-body>

另一个有趣的事情是,也可以通过策略设置以 byte[] 形式出现的证书:

<authentication-certificate body="@(context.Variables.GetValueOrDefault<byte[]>("byteCertificate"))" password="optional-certificate-password" />

看到这个link:microsoft.com/en-us/azure/api-management/api-management-authentication-policies