2017-08-17 83 views
-2

我想这样发送没有一个单一的对象,而是一个复杂的对象从SERVER1到SERVER2。发送一个复杂的对象从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

通过将其序列化并反序列化为object类型,您实际上会丢弃所有可以告诉后面的代码(在服务器2上)的任何有关最初数据类型的信息。

去往和来自JSON的序列化/反序列化与铸造不同。这是将包含一系列属性的对象从代码对象转换为字符串并再次转换的过程。它完全依赖于匹配指定类型的属性名称。在这种情况下,object没有任何属性,所以没有任何匹配。由于JSON中的属性与给定类型中的任何内容都不匹配,因此您在反序列化时会有效地丢弃JSON中的所有内容。

我想你可能需要在server2上有两个操作方法,一个需要[FromBody]List<CustomClass1> dto和另一个相同,但是对于CustomClass2。您的客户必须决定在不同情况下发送哪一个。另一方面,如果你想发送一个包含两种类型的对象混合的列表,那么你可以尝试对包含所有可能字段的接口定义进行反序列化,或者你也可以尝试使用dynamic或许可以使用dynamic 。如果之后需要将其转换为两个具体类中的一个,则可能需要手动检查已填充的属性以确定它的类型。这可能意味着你正在尝试做的更广泛的设计问题,但这不是真正在这里处理的范围内的事情。

相关问题