.NET 6向.NET 8发送POST请求时参数始终为null的问题
问题解决方案
核心问题分析
你的问题主要出在请求内容类型不匹配和ASP.NET Core参数绑定规则两个方面:
- 发送端的
StringContent未指定application/json媒体类型,导致接收端的JSON解析器无法识别请求内容。 - 直接传递纯JSON字符串时,ASP.NET Core的参数绑定需要明确配置或使用正确的绑定方式。
步骤1:修复发送端代码
修改StringContent的初始化,显式指定编码和媒体类型,确保请求内容被标记为JSON格式:
Uri RecommendationServiceUrl = new Uri("http://localhost:58815"); string message = "Hi"; using (var client = new HttpClient { BaseAddress = RecommendationServiceUrl }) { client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); // 关键:添加编码和Content-Type指定 var content = new StringContent(JsonConvert.SerializeObject(message), Encoding.UTF8, "application/json"); var response = await client.PostAsync($"api/recommendations/getrecommendation", content); }
步骤2:修复接收端代码
有两种可行的方案,任选其一即可:
方案A:直接接收纯JSON字符串
给参数添加[FromBody]特性,同时确保.NET 8的JSON序列化配置允许顶级字符串(默认已开启,若有自定义配置可检查):
[HttpPost] [Route("api/recommendations/getrecommendation")] public IActionResult Post([FromBody] string test) { return Ok(test); }
方案B:使用DTO类包装参数(推荐)
这种方式更符合RESTful API设计规范,也能避免纯字符串绑定的潜在问题:
- 定义一个简单的DTO类:
public class RecommendationRequest { public string Test { get; set; } }
- 修改控制器方法:
[HttpPost("api/recommendations/getrecommendation")] public IActionResult Post([FromBody] RecommendationRequest request) { return Ok(request.Test); }
- 同步修改发送端的序列化对象:
// 替换原来的message序列化,改为序列化DTO对象 var requestDto = new { Test = message }; var content = new StringContent(JsonConvert.SerializeObject(requestDto), Encoding.UTF8, "application/json");
步骤3:检查.NET 8项目的启动配置
确保你的启动代码正确配置了控制器服务和中间件:
如果是使用Program.cs(.NET 8默认模板):
var builder = WebApplication.CreateBuilder(args); // 添加控制器服务 builder.Services.AddControllers() .AddJsonOptions(options => { // 可选:显式开启顶级JSON字符串支持(默认已开启) options.JsonSerializerOptions.AllowTrailingCommas = true; // 可选:忽略属性大小写匹配 options.JsonSerializerOptions.PropertyNameCaseInsensitive = true; }); var app = builder.Build(); // 确保路由和控制器中间件顺序正确 app.UseRouting(); app.MapControllers(); app.Run();
如果是使用传统Startup.cs:
public void ConfigureServices(IServiceCollection services) { services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.AllowTrailingCommas = true; options.JsonSerializerOptions.PropertyNameCaseInsensitive = true; }); services.AddHttpClient(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // 其他中间件(如异常处理、静态文件等) app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); }
额外排查点
- 确认.NET 8项目的运行端口确实是
58815,可在项目属性的"调试"选项卡中查看。 - 如果.NET 8项目启用了HTTPS,发送端的URL需改为
https://localhost:xxxx,否则会出现请求失败。 - 可先用Postman或Swagger测试.NET 8的接口,确认接口本身能正常接收参数,再排查发送端代码。
内容的提问来源于stack exchange,提问作者BigNull
相关产品推荐
相关产品推荐

