You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 6向.NET 8发送POST请求时参数始终为null的问题

问题解决方案

核心问题分析

你的问题主要出在请求内容类型不匹配和ASP.NET Core参数绑定规则两个方面:

  1. 发送端的StringContent未指定application/json媒体类型,导致接收端的JSON解析器无法识别请求内容。
  2. 直接传递纯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设计规范,也能避免纯字符串绑定的潜在问题:

  1. 定义一个简单的DTO类:
public class RecommendationRequest
{
    public string Test { get; set; }
}
  1. 修改控制器方法:
[HttpPost("api/recommendations/getrecommendation")]
public IActionResult Post([FromBody] RecommendationRequest request)
{
    return Ok(request.Test);
}
  1. 同步修改发送端的序列化对象:
// 替换原来的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 13:47:38