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为例:
- 安装
Newtonsoft.JsonNuGet包 - 自定义转换器:
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); } }
- 客户端配置序列化:
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;
- 后端配置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
相关产品推荐
相关产品推荐

