Azure APIM接收含runtime关键词JSON请求时的异常问题求助
问题诊断与解决方案
可能根因
- APIM内置安全策略(如威胁检测、内容过滤)将"runtime"识别为敏感关键词,触发异常拦截或畸形转发,导致后端容器崩溃
- APIM对JSON请求的自动格式化/转义逻辑,导致含"runtime"的请求体被错误修改,触发后端C#反序列化未捕获异常
最优解决方案
1. 检查并调整APIM安全策略
- 登录Azure门户进入目标APIM实例,打开对应API的入站策略或全局策略
- 排查是否存在
validate-content、restrict-content或自定义威胁检测规则,确认是否将"runtime"列为拦截关键词 - 修改策略排除该关键词,例如将拦截动作改为日志记录,或直接移除相关规则:
<validate-content unspecified-content-type-action="ignore" max-size="102400" size-exceeded-action="reject"> <content-type-checks> <content-type value="application/json"> <rule name="NoSensitiveWords" pattern="^(?!.*runtime).*$" negate="false" action="log" /> <!-- 将action从reject改为log,或删除该规则 --> </content-type> </content-type-checks> </validate-content>
2. 透传原始请求体,禁用APIM自动修改
- 在API入站策略中添加配置,直接转发原始请求体,避免APIM对JSON内容做额外处理:
<policies> <inbound> <set-header name="Content-Type" exists-action="override"> <value>application/json</value> </set-header> <set-body>@(context.Request.Body.As<string>(preserveContent: true))</set-body> </inbound> </policies>
3. 后端C#反序列化容错配置(兜底)
- 若APIM调整后仍有问题,在后端配置反序列化容错,避免特殊文本触发崩溃:
// System.Text.Json配置示例 var serializerOptions = new JsonSerializerOptions { PropertyNameCaseInsensitive = true, ReadCommentHandling = JsonCommentHandling.Skip, AllowTrailingCommas = true, // 忽略无法映射的属性,避免反序列化异常 IgnoreUnknownFields = true }; var requestModel = JsonSerializer.Deserialize<YourTargetModel>(requestBody, serializerOptions);
4. 排查APIM请求日志
- 在APIM门户监控 > 日志中筛选目标请求,对比原始请求体与转发到后端的请求体差异,确认是否存在APIM修改内容的情况
内容的提问来源于stack exchange,提问作者Brunno
相关产品推荐
相关产品推荐

