2016-11-21 68 views
0

我有以下的WebAPI动作insed控制器(例如):接收抽象类型作为输入

public MyAbstractClass Action1(MyAbstractClass input) 
{ 
    return input; 
} 

类结构是如下所示:

public class MyAbstractClass 
{ 
    public int ID {get;set;} 
    public string Name {get;set;} 
} 

public class ConcreteClass1 : MyAbstractClass 
{ 
    public string Foo {get;set;} 
} 

public class ConcreteClass1 : MyAbstractClass 
{ 
    public string Bar {get;set;} 
} 

我湾进行呼叫到WebAPI Action1用描述其中一个具体类的JSON,但它总是返回null。

我已经把我的格式是这样的:

public static void Configure(MediaTypeFormatterCollection formatters) 
{ 
    var jsonFormatter = formatters.JsonFormatter; 
    var settings = jsonFormatter.SerializerSettings; 

    settings.Formatting = Formatting.Indented; 
    settings.TypeNameHandling = TypeNameHandling.Objects; 
    settings.ContractResolver = new CamelCaseExceptDictionaryKeysResolver(); 
} 

private class CamelCaseExceptDictionaryKeysResolver : CamelCasePropertyNamesContractResolver 
{ 
    protected override JsonDictionaryContract CreateDictionaryContract(Type objectType) 
    { 
     JsonDictionaryContract contract = base.CreateDictionaryContract(objectType); 

     contract.DictionaryKeyResolver = propertyName => propertyName; 

     return contract; 
    } 
} 

注意我有一个自定义的解析器。我将settings.TypeNameHandling = TypeNameHandling.Objects;

,所以我发送POST请求难熬JSON看起来像这样:

{ 
    "$type": "MyNameSpace.SubNameSpace.ConcreteClass1" 
    "id":100, 
    "name":"some name", 
    "foo":"some value of foo..." 
} 

,但仍然收到null作为输出..意思是消毒器无法使具体的类别失去理性。

我在这里错过了什么?

回答

0

发现问题。

发布对象时,我已经设置了

"$type": "MyNameSpace.SubNameSpace.ConcreteClass1" 

需要将其设置为:

"$type": "MyNameSpace.SubNameSpace.ConcreteClass1, DLLName" 

不得不添加... ,DLLName所以这将是完全合格的名称。