本地C#调用IIS部署的.NET Core 7 Web API POST请求返回空串问题
IIS部署的.NET Core 7 Web API POST请求无效果排查
问题情况
- 本地C#代码调用IIS上的Web API,GET请求正常,但POST请求返回200状态码却无响应体,且未触发API内的数据变更逻辑
- PostMan和前端AJAX调用该POST端点完全正常,能正常触发数据变更
- 本地运行API时,相同C#代码调用本地API的POST请求工作正常
客户端POST请求代码
var client = new HttpClient(); var request = new HttpRequestMessage(HttpMethod.Post, "{URL}"); request.Headers.Add("Authorization", "Bearer {API_TOKEN}"); client.DefaultRequestHeaders.Add("X-Requested-With", "XMLHttpRequest"); var content = new StringContent("{\r\n \"State\": \"PA\",\r\n \"Zip\": \"19087\",\r\n \"Country\": \"United States\"\r\n}", null, "application/json"); request.Content = content; var response = Task.Run(async () => await client.SendAsync(request)).Result; response.EnsureSuccessStatusCode(); var ret = Task.Run(async () => await response.Content.ReadAsStringAsync()).Result;
API控制器POST端点代码
[HttpPost] [ProducesResponseType(typeof(Venue), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] [ProducesResponseType(StatusCodes.Status400BadRequest)] public IActionResult Post([FromBody] Venue Venue) { if (Venue == null) return BadRequest(); Venue venue = _venueListDAL.UpsertVenue(Venue); return venue == null ? NotFound(null) : Ok(venue); }
已尝试的序列化方式
var data = JsonConvert.SerializeObject(Venue); request.Content = new StringContent(data, null, "application/json");
排查解决建议
- 指定UTF-8编码:StringContent默认使用ASCII编码,可能导致API解析请求体失败,修改为:
var content = new StringContent(jsonStr, System.Text.Encoding.UTF8, "application/json"); - 改用全异步写法:用
.Result阻塞异步调用可能引发死锁或吞掉异常,换成异步方法执行:using var client = new HttpClient(); client.DefaultRequestHeaders.Add("X-Requested-With", "XMLHttpRequest"); var request = new HttpRequestMessage(HttpMethod.Post, "{URL}"); request.Headers.Add("Authorization", "Bearer {API_TOKEN}"); var content = new StringContent(jsonStr, System.Text.Encoding.UTF8, "application/json"); request.Content = content; var response = await client.SendAsync(request); response.EnsureSuccessStatusCode(); var ret = await response.Content.ReadAsStringAsync(); - 查看IIS站点日志:在IIS中找到对应站点的日志文件,检查该POST请求的详细记录,看是否存在重定向、参数解析失败等隐性问题
- 开启API模型绑定日志:在API的
appsettings.json中添加日志配置,查看模型绑定是否失败:{ "Logging": { "LogLevel": { "Microsoft.AspNetCore.Mvc.ModelBinding": "Debug" } } } - 抓包对比请求差异:用Fiddler或Charles抓取C#代码、PostMan、AJAX的请求包,对比头信息、请求体格式、编码等是否有差异(比如Authorization头格式、Content-Length是否正确)
- 检查IIS规则:确认IIS是否对POST请求设置了URL重写或其他拦截规则,导致请求被转发到无效端点
- 验证Token权限:虽然GET请求正常,但需确认POST请求的Token是否具备对应操作权限,或Token在传输中是否被截断
内容的提问来源于stack exchange,提问作者parrigin777
相关产品推荐
相关产品推荐

