.NET Core MVC部署AWS Elastic Beanstalk后第三方回调接口解析异常
问题根因
- 两个环境的回调请求格式存在差异:Azure环境下第三方回调发送的是
application/json格式的纯JSON请求体,而AWS环境下回调为multipart/form-data格式的表单请求,JSON内容被封装在名为json的表单字段中。原有直接读取整个请求体的逻辑在AWS环境下拿到的是包含边界标识的完整multipart报文,无法直接解析为JSON,因此逻辑失效。
修复代码
你可以通过兼容两种请求格式的方式修改代码,同时优化原有同步读请求体可能导致的线程阻塞问题:
[HttpPost] [Route("CallBack")] public async Task<string> CallBack() { try { eSignService eSignService = new eSignService(); string jsonContent = string.Empty; // 同时适配两种请求格式 if (Request.HasFormContentType) { // 处理AWS场景的表单请求,读取json字段 if (Request.Form.TryGetValue("json", out var jsonField)) { jsonContent = jsonField; } } else { // 处理Azure场景的纯JSON请求 using var reader = new StreamReader(Request.Body); jsonContent = await reader.ReadToEndAsync(); } if (!string.IsNullOrWhiteSpace(jsonContent)) { // 原有业务逻辑,注意需要先反序列化JSON字符串再使用 // 示例:dynamic jsonObj = JsonSerializer.Deserialize<dynamic>(jsonContent); } else { _logger.LogInformation("No Data Found"); } } catch (Exception ex) { _logger.LogInformation("Error : " + ex); } return "Hello API Event Received"; }
注意事项
- 若回调请求体积较大,需要确认AWS Elastic Beanstalk的反向代理(Nginx/IIS)是否放开了表单请求大小限制,避免请求被代理层拦截。
- 原有代码中使用
.GetAwaiter().GetResult()同步读取异步方法返回值,容易引发线程死锁,建议统一使用异步await操作。
内容的提问来源于stack exchange,提问作者Nag
相关产品推荐
相关产品推荐

