我正在尝试这样发送不是单个对象,而是从SERVER1到SERVER2的复杂对象。
服务器1:
/// <summary>
/// SERVER 1
/// </summary>
internal void SomeActionMethod(Guid sid, CustomClass2 offer, List<CustomClass1> calculation)
{
//The reason for wrapping this, is that "PostAsJsonAsync" will only except 1 dto, but I need both.
List<Object> dto = new List<object>();
dto.Add(offer);
dto.Add(calculation);
var resp = _client.PostAsJsonAsync(_baseadress + @"someController/SomeActionMethod?sid=" + sid.ToString(), dto).Result;
if (!resp.IsSuccessStatusCode)
throw new Exception(...);
}
服务器2:
/// <summary>
/// SERVER 2
/// </summary>
public void SomeActionMethod(Guid sid, [FromBody]List<object> dto)
{
//unwrapp
CustomClass2 offer=new CustomClass2();
List<CustomClass1> calculation=new List<CustomClass1>();
foreach (var server1_item in dto)
{
if (server1_item is CustomClass2)
offer = (CustomClass2)server1_item;
else if (server1_item is List<CustomClass1>)
calculation = (List<CustomClass1>)server1_item;
else
continue;
}
//Do some stuff
}
我得到了一些JSON,但我不能检查(server1_item is CustomClass2)
。
在这做什么,我该如何解决这个问题?!
感谢。
答案 0 :(得分:0)
通过将其序列化并反序列化为object
类型,您实质上会丢弃所有信息,这些信息会告诉后面的代码(在服务器2上)有关数据最初类型的任何信息。
与JSON进行序列化/反序列化与强制转换不同。它是将包含一系列属性的对象从代码对象转换为字符串,然后再转换回来的过程。它完全依赖于匹配指定类型的属性名称。在这种情况下,object
没有属性,因此没有任何匹配。在反序列化时,您可以有效地丢弃JSON中的所有内容,因为JSON中的属性不匹配给定类型中的任何内容。
我认为你可能需要在server2上有两个动作方法,一个用于[FromBody]List<CustomClass1> dto
,另一个用于CustomClass2
。您的客户必须决定在不同情况下发送哪一个。
另一方面,如果您尝试发送包含两种类型对象混合的列表,那么您可以尝试反序列化到包含所有可能字段的接口定义,或者您可以尝试使用{ {1}}也许吧。然后,如果您之后需要转换为两个具体类之一,则可能必须对填充的属性进行一些手动检查以确定它的类型。这可能会在您尝试做的事情中指出更广泛的设计问题,但这并不是在这里处理范围的事情。