ASP.NET 6 Core Web API部署Azure后POST请求返回GET结果异常
问题现象
- 向ASP.NET 6 Core Web API发送POST请求时出现异常行为,测试场景已简化为最小复现版本,仅保留简单的GET、POST两个控制器方法
- 本地开发环境下,通过Postman向API发送GET、POST请求均可返回正确结果
- API部署到Azure后发送POST请求时,Postman返回的是GET请求的结果,不符合POST接口的预期返回值
- Postman日志控制台显示,POST请求发出后会立刻触发一个GET请求,该现象在使用IIS Express的本地开发环境中不会出现
- 本次测试的控制器发布地址:
https://api2.matiasmasso.es/test
复现代码
using Microsoft.AspNetCore.Mvc; namespace Api.Controllers { [ApiController] [Route("[controller]")] public class TestController : ControllerBase { [HttpPost()] public IActionResult Post() { IActionResult retval = Ok("Success on Post!"); return retval; } [HttpGet()] public IActionResult Get() { IActionResult retval = Ok("Success on Get!"); return retval; } } }
问题根因
该现象是POST请求触发3xx重定向后,HTTP客户端默认将重定向请求改为GET方法导致的:
- 部署到Azure后,站点默认存在URL重写规则(自动追加尾部斜杠、HTTP强制跳HTTPS等),发送POST请求到
/test时,服务端会先返回301/302重定向响应,要求跳转到/test/或者HTTPS地址 - Postman默认开启自动跟随重定向,按照HTTP旧规范实现逻辑,POST请求收到301/302响应时,会自动改用GET方法请求重定向后的地址,最终命中GET接口返回对应结果
- 本地IIS Express环境默认没有配置这类自动重定向规则,因此不会出现该问题
排查与解决方法
- 先确认重定向行为:在Postman设置中临时关闭自动跟随重定向选项,重新发送POST请求,即可看到原始的3xx响应状态码和Location响应头,确认具体的重定向目标
- 临时验证方案:发送POST请求时直接使用带尾部斜杠的地址
https://api2.matiasmasso.es/test/,同时确保直接使用HTTPS协议发起请求,避开重定向规则即可正常得到POST接口返回 - 永久修复方案1:如果是Azure App Service/IIS层面的URL重写规则导致自动加斜杠,前往Azure门户的应用服务配置中,删除对应的追加尾部斜杠重写规则
- 永久修复方案2:如果是ASP.NET Core路由层自动追加尾部斜杠导致的跳转,在Program.cs中修改路由配置关闭该行为,参考代码:
builder.Services.Configure<RouteOptions>(options => { // 关闭自动追加尾部斜杠的重定向逻辑 options.AppendTrailingSlash = false; });
- 永久修复方案3:如果已经在Azure前置了CDN、WAF或者Front Door做HTTPS卸载,直接关闭ASP.NET Core层的
UseHttpsRedirection中间件,避免应用层重复做HTTPS跳转触发请求方法变更
内容的提问来源于stack exchange,提问作者Matias Masso
相关产品推荐
相关产品推荐

