问题描述
使用APIM服务,当遇见上传文件的请求时,需要考虑大文件对APIM性能的影响。
所以,是否可以使用APIM策略来监测请求body大小,如果超过50MB,就返回413 Payload too Large呢?
问题解答
当然可以。实现思路如下:
1: 在API的Policy中,在Inbound中获取请求的Size(context.Request.Headers["Content-Length"][0])并保存为一个参数bodySize
2: 使用choose 语句来判断bodySize小于 50MB ( 50 * 1024 * 1024 = 52428800 bytes), 小于则继续。
3: 如果大于了50MB,就使用 return-response 返回413并添加提示信息
示例策略如下:
<policies>
<inbound>
<base />
<set-variable name="bodySize" value="@(context.Request.Headers["Content-Length"][0])" />
<choose>
<when condition="@(int.Parse(context.Variables.GetValueOrDefault<string>("bodySize"))<52428800)">
<!--let it pass through by doing nothing-->
</when>
<otherwise>
<return-response>
<set-status code="413" reason="Payload too large" />
<set-body>@{
return "Maximum allowed size for the requests is 50 MB. This request has size of "+ context.Variables.GetValueOrDefault<string>("bodySize") +" bytes";
}</set-body>
</return-response>
</otherwise>
</choose>
</inbound>
<backend>
<base />
</backend>
<outbound>
<base />
</outbound>
<on-error>
<base />
</on-error>
</policies>
测试结果如下:
参考资料
APIM Policy 设置变量 : https://docs.azure.cn/zh-cn/api-management/set-variable-policy
APIM Policy 返回响应 : https://docs.azure.cn/zh-cn/api-management/return-response-policy
APIM Policy 控制流 : https://docs.azure.cn/zh-cn/api-management/choose-policy
How to prevent large file POST requests using Azure APIM? https://stackoverflow.com/questions/60448273/how-to-prevent-large-file-post-requests-using-azure-apim
当在复杂的环境中面临问题,格物之道需:浊而静之徐清,安以动之徐生。 云中,恰是如此!