ASP.NET 核心 1.1.0 字典的归零值<string,object>

ASP.NET Core 1.1.0 nulling values of Dictionary<string,object>

我有一个 ASP.NET WebAPI 核心 1.1.0 应用程序,当 returned 给调用者时,它没有正确序列化我的响应。我有一个带有 属性 的对象,它是一个 Dictionary<string,object>,当响应被 return 发送给调用者时,Payload 字典中的值被清零。

对象:

ResponseObject {
  string ID {get; set;}
  DateTime Date {get; set;}
  Dictionary<string,object> Payload {get; set;}
  ...
}

控制器:

[HttpPost]
public async Task<ResponseObject> Post([FromBody] ResponseObject request) {
  // Object here is deserialized correctly.
  // Do work
  ResponseObject response = ...
  // Object here has values in the Payload
  return response;
}

当请求进入应用程序时,它被正确反序列化为 ResponseObject,应用程序会进行一些处理,然后 return 该对象以修改后的形式返回。 Payload 字典中的键可以更改名称和编号。当 ResponseObject 即将 return 时,我可以在调试中看到数据在 Payload 字典中。一旦调试器离开控制器的 return 并发回给调用者,字典值就是空的。

基于此,我可以假设在 return 之后 ResponseObject 的序列化过程中 ASP.NET 核心应用程序中发生了问题。我不想更改默认的序列化程序,因为应用程序中的其他所有内容都按预期工作。我知道使用 Json.NET 对 ResponseObject 进行反序列化和序列化是有效的,因为该应用程序在应用程序的其他部分可以完美地完成它。我唯一能想到的是默认的 WebAPI 序列化程序使用不同的选项或者是不同的实现。

我错过了什么?我可以为序列化程序设置一个选项来显示值吗?或者我必须更改默认的序列化程序吗?还是有其他我没有看到的解决方案?

我知道你说过你不想使用 Json.NET。相反,您可以尝试以下方法

return Json(response);

我最终将控制器上的 return 类型更改为字符串并自己直接序列化对象。这样我就可以控制序列化的完成方式,而不必依赖 WebAPI 的魔术豆来帮我完成。它不是最理想的解决方案,也不是我想要的,但它确实有效。生成的有效控制器如下:

[HttpPost]
public async Task<string> Post([FromBody] ResponseObject request) {
  // Do work
  ResponseObject response = ...
  // I am using Jil here, but you could also use Json.NET
  return JSON.SerializeDynamic(response);
  // return JsonConvert.SerializeObject(response);
}