C# ASP.NET Core 1.1.0为字典的值置零<;字符串,对象>;

C# ASP.NET Core 1.1.0为字典的值置零<;字符串,对象>;,c#,asp.net-core,json.net,asp.net-core-1.1,C#,Asp.net Core,Json.net,Asp.net Core 1.1,我有一个ASP.NET WebAPI Core 1.1.0应用程序,在返回给调用方时未正确序列化我的响应。我有一个对象,其属性是字典,当响应返回给调用方时,有效负载字典中的值将被清空 对象: ResponseObject { string ID {get; set;} DateTime Date {get; set;} Dictionary<string,object> Payload {get; set;} ... } ResponseObject{ 字符串ID{

我有一个ASP.NET WebAPI Core 1.1.0应用程序,在返回给调用方时未正确序列化我的响应。我有一个对象,其属性是
字典
,当响应返回给调用方时,
有效负载
字典中的值将被清空

对象:

ResponseObject {
  string ID {get; set;}
  DateTime Date {get; set;}
  Dictionary<string,object> Payload {get; set;}
  ...
}
ResponseObject{
字符串ID{get;set;}
日期时间日期{get;set;}
字典有效负载{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;
}
[HttpPost]
公共异步任务Post([FromBody]响应对象请求){
//此处的对象已正确反序列化。
//工作
ResponseObject响应=。。。
//对象在有效负载中具有值
返回响应;
}
当请求进入应用程序时,它会被反序列化到
ResponseObject
中,应用程序会进行一些处理,并以修改后的形式返回该对象。
有效负载
字典中的键可以更改名称和编号。当
ResponseObject
即将返回时,我可以在调试中看到数据在
Payload
字典中。调试器离开控制器的
返回
并发送回调用者后,字典值为空

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


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

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

return Json(response);

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

return Json(response);

最后,我将控制器上的返回类型更改为字符串,并直接序列化对象。这样我就可以控制序列化的完成方式,而不必依赖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);
}
[HttpPost]
公共异步任务Post([FromBody]响应对象请求){
//工作
ResponseObject响应=。。。
//我在这里使用Jil,但您也可以使用Json.NET
返回JSON.SerializeDynamic(响应);
//返回JsonConvert.SerializeObject(响应);
}

我最终将控制器上的返回类型更改为字符串,并直接序列化对象。这样我就可以控制序列化的完成方式,而不必依赖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);
}
[HttpPost]
公共异步任务Post([FromBody]响应对象请求){
//工作
ResponseObject响应=。。。
//我在这里使用Jil,但您也可以使用Json.NET
返回JSON.SerializeDynamic(响应);
//返回JsonConvert.SerializeObject(响应);
}

不行。不幸的是,这并没有解决问题。和以前一样的精确输出。不可以。不幸的是,这并没有解决问题。与以前完全相同的输出。当属性声明为
IDictionary
时,是否观察到相同的行为?是的。同样的问题。请在GitHub@AlexWiese上提出一个问题。有趣的是,我在构建一个新的示例项目时无法复制这个问题,以便打开该问题。必须与我们的Web API的特定配置有关。我没有时间或动机去弄清楚到底是什么问题。感谢您的建议。当属性声明为
IDictionary
时,您是否观察到相同的行为?是的,我观察到了。同样的问题。请在GitHub@AlexWiese上提出一个问题。有趣的是,我在构建一个新的示例项目时无法复制这个问题,以便打开该问题。必须与我们的Web API的特定配置有关。我没有时间或动机去弄清楚到底是什么问题。谢谢你的建议。