ASP.NET Core 7中出站POST请求被转为GET的原因是什么?
ASP.NET Core 7出站POST请求被转为GET的排查分析
我有两个部署在Azure App Service上的ASP.NET Core 7应用,特定场景下service1需要通过私有VNet向service2发送POST请求。该请求在预发布(staging)环境运行正常,但生产环境中POST请求被转为GET请求,导致调用失败。
请问.NET Core中出站POST请求被转为GET请求的可能原因有哪些?
上下文信息:为Refit添加额外日志
Refit客户端配置代码
services .AddRefitClient<IService2Api>( (sp) => new RefitSettings { CollectionFormat = CollectionFormat.Multi, HttpMessageHandlerFactory = () => new LoggingHandler( sp.GetRequiredService<ILoggerFactory>() .CreateLogger<LoggingHandler>(), new HttpClientHandler() { AllowAutoRedirect = true } ) } ) .ConfigureHttpClient( // ...
LoggingHandler实现代码
private class LoggingHandler : DelegatingHandler { private readonly ILogger<LoggingHandler> logger; public LoggingHandler(ILogger<LoggingHandler> logger, HttpMessageHandler innerHandler) : base(innerHandler) { this.logger = logger; } protected override HttpResponseMessage Send( HttpRequestMessage request, CancellationToken cancellationToken ) { logger.LogDebug("Before [{Method}] to {Url}", request.Method, request.RequestUri); var response = base.Send(request, cancellationToken); logger.LogDebug("After [{Method}] to {Url}", request.Method, request.RequestUri); return response; } protected override async Task<HttpResponseMessage> SendAsync( HttpRequestMessage request, CancellationToken cancellationToken ) { logger.LogDebug("Before [{Method}] to {Url}", request.Method, request.RequestUri); var response = await base.SendAsync(request, cancellationToken); logger.LogDebug("After [{Method}] to {Url}", request.Method, request.RequestUri); return response; } }
日志内容
2023-11-24 23:34:11.315 +00:00 [Information] System.Net.Http.HttpClient.Refit.Implementation.Generated+IService2Api, Common, Version=1.0.1.0, Culture=neutral, PublicKeyToken=null.ClientHandler: Sending HTTP request POST http://service2.azurewebsites.net/my/endpoint/ 2023-11-24 23:34:11.315 +00:00 [Trace] System.Net.Http.HttpClient.Refit.Implementation.Generated+IService2Api, Common, Version=1.0.1.0, Culture=neutral, PublicKeyToken=null.ClientHandler: Request Headers: Authorization: Bearer [Redacted] User-Agent: Service1, (Service1/1.0.1.0) Content-Type: application/json; charset=utf-8 2023-11-24 23:34:11.315 +00:00 [Debug] LoggingHandler: Before [POST] to http://service2.azurewebsites.net/my/endpoint/ 2023-11-24 23:34:11.400 +00:00 [Debug] LoggingHandler: After [GET] to https://service2.azurewebsites.net/my/endpoint/ 2023-11-24 23:34:11.401 +00:00 [Information] System.Net.Http.HttpClient.Refit.Implementation.Generated+IService2Api, Common, Version=1.0.1.0, Culture=neutral, PublicKeyToken=null.ClientHandler: Received HTTP response headers after 85.2956ms - 405 2023-11-24 23:34:11.401 +00:00 [Trace] System.Net.Http.HttpClient.Refit.Implementation.Generated+IService2Api, Common, Version=1.0.1.0, Culture=neutral, PublicKeyToken=null.ClientHandler: Response Headers: Date: Fri, 24 Nov 2023 23:34:11 GMT Set-Cookie: [Redacted] Content-Length: 0 Allow: POST
可能的原因分析
从日志可见,请求原本使用http协议发送POST,最终被重定向到https协议并转为GET,结合环境和.NET HttpClient行为,核心原因如下:
HttpClient自动重定向的默认行为:
HttpClientHandler的AllowAutoRedirect默认开启,当服务器返回301/302重定向时,HttpClient会遵循早期HTTP规范,将原始POST请求转为GET请求跟进重定向。Azure App Service强制HTTPS配置差异:
生产环境的Azure App Service大概率开启了强制HTTPS设置(预发布环境未开启),当收到HTTP请求时会返回301/302重定向到HTTPS地址,触发了上述HttpClient的重定向行为。未明确配置重定向策略:
当前代码中HttpClientHandler仅设置了AllowAutoRedirect = true,未指定重定向时保留请求方法的策略,导致默认行为生效。
解决建议
- 直接使用HTTPS地址调用:将请求目标改为
https://service2.azurewebsites.net,从根源避免重定向触发。 - 修改HttpClient重定向配置:
- 关闭自动重定向(
AllowAutoRedirect = false),手动处理重定向逻辑; - 若需保留自动重定向,使用
SocketsHttpHandler并配置RedirectPolicy,确保重定向时保留POST方法(.NET Core 2.1+支持)。
- 关闭自动重定向(
- 检查Azure环境配置:确认生产环境App Service的强制HTTPS设置,根据业务需求调整或确保请求全程使用HTTPS。
内容的提问来源于stack exchange,提问作者Felix ZY
相关产品推荐
相关产品推荐

