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

C#向Post接口上传Type对象时后端接收为null的问题求助

解决Post上传C# Type对象后端接收为null的问题

核心原因

Type是反射类型,包含大量运行时元数据,默认JSON序列化器(如System.Text.Json、Newtonsoft.Json)无法将其序列化为可完整反序列化的JSON结构,导致后端接收时只能得到null。

解决方案

方案一:传递类型的完全限定名(推荐)

放弃直接传递Type对象,改为传递类型的完全限定名字符串,后端通过反射还原成Type实例,这是最简单可靠的方式。

客户端代码修改

HttpClient httpClient = new HttpClient();
httpClient.BaseAddress = new Uri(@"http://localhost:5000");

// 传递类型的完全限定名
var typeFullName = typeof(Student).AssemblyQualifiedName;
var res = httpClient.PostAsJsonAsync(@"/api/ModelPayload/SendModelPayload", typeFullName).Result;

后端代码修改

[HttpPost]
[Route("SendModelPayload")]
public async Task<IActionResult> SendModelPayload([FromBody] string typeFullName)
{
    Type type = Type.GetType(typeFullName);
    if (type == null)
    {
        return BadRequest("无法识别目标类型,请检查类型名称是否正确");
    }
    
    // 执行后续业务逻辑
    return Ok("test");
}

注意:AssemblyQualifiedName包含类型所在程序集的信息,确保后端能加载到该类型对应的程序集,否则Type.GetType会返回null。

方案二:自定义Type的JSON序列化转换器(不推荐)

如果必须传递Type对象,可以通过自定义JSON转换器实现序列化/反序列化,但该方式复杂度高,且跨进程传输时容易因程序集依赖问题失败。

以Newtonsoft.Json为例:

  1. 安装Newtonsoft.Json NuGet包
  2. 自定义转换器:
public class TypeJsonConverter : JsonConverter<Type>
{
    public override Type ReadJson(JsonReader reader, Type objectType, Type existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        var typeName = reader.Value?.ToString();
        return string.IsNullOrEmpty(typeName) ? null : Type.GetType(typeName);
    }

    public override void WriteJson(JsonWriter writer, Type value, JsonSerializer serializer)
    {
        writer.WriteValue(value.AssemblyQualifiedName);
    }
}
  1. 客户端配置序列化:
HttpClient httpClient = new HttpClient();
httpClient.BaseAddress = new Uri(@"http://localhost:5000");

var serializerSettings = new JsonSerializerSettings();
serializerSettings.Converters.Add(new TypeJsonConverter());
var jsonContent = JsonConvert.SerializeObject(typeof(Student), serializerSettings);
var content = new StringContent(jsonContent, Encoding.UTF8, "application/json");

var res = httpClient.PostAsync(@"/api/ModelPayload/SendModelPayload", content).Result;
  1. 后端配置Newtonsoft.Json作为序列化器并添加转换器:
    在Startup/Program中配置:
services.AddControllers().AddNewtonsoftJson(options =>
{
    options.SerializerSettings.Converters.Add(new TypeJsonConverter());
});

后端接口保持原参数:

[HttpPost]
[Route("SendModelPayload")]
public async Task<IActionResult> SendModelPayload([FromBody] Type type)
{
    if (type == null)
    {
        return BadRequest("类型反序列化失败");
    }
    // 业务逻辑
    return Ok("test");
}

总结

优先选择方案一,传递类型完全限定名的方式简单、稳定,避免Type序列化带来的潜在问题。

内容的提问来源于stack exchange,提问作者K Yugandhar Reddy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 19:40:19