2012-07-13 20 views
2

使用ASP.NET WebApi 4 RC,是否可以將ApiController的返回類型作爲基類並實際返回派生類的實例?嘗試執行此操作時,返回xml時會導致內部服務器錯誤(500)。使用此方法返回json可正常工作。使用基類作爲ApiController中的返回類型

public class Base 
{ 
    public int ID { get; set; } 
} 
public class Derived : Base 
{ 
    public string Message { get; set; } 
} 
public class ValuesController : ApiController 
{ 
    public IEnumerable<Base> Get() 
    { 
     return new Derived[] { 
      new Derived(){ Message="test"}, 
      new Derived(){ Message="another"} 
     }; 
    } 
} 

看起來XML序列化是拋出錯誤,但我可以看到的是通用500錯誤。

回答

1

是的,你需要使用knowntype系列化提示:

[System.Runtime.Serialization.KnownType(typeof(Derived))] 
public class Base 
{ 
    public int ID { get; set; } 
} 
+0

完美。正是我需要的。 – vtforester 2012-07-13 20:02:53

+0

你意識到這個問題是複製重複副本(...)的副本:-) – 2012-07-13 21:45:52

+0

@FilipW所以哪個問題最終都會帶有數百個upvotes和.NET專家的答案。 .. 我找不到它。 – felickz 2014-03-10 20:45:53

0

你可能想這樣做編程

private static Type[] GetKnownType() 
    { 
     var assemblies = AppDomain.CurrentDomain.GetAssemblies(); 
     var knownTypes = new List<Type>(); 
     foreach (var assembly in assemblies) 
     { 
      knownTypes.AddRange(assembly.GetTypes().Where(x => x.BaseType == typeof (BaseResponse)).ToArray()); 
     } 
     return knownTypes.ToArray(); 
    } 

千萬記住你的子類必須有一個默認的構造函數否則你會得到運行時序列化錯誤。

相關問題