在ApiController中使用基类作为返回类型

时间:2012-07-13 19:50:20

标签: xml-serialization asp.net-web-api

使用ASP.NET WebApi 4 RC,是否可以将ApiController的返回类型作为基类并实际返回派生类的实例?现在尝试执行此操作会在返回xml时导致内部服务器错误(500)。使用此方法返回json可以正常工作。

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错误。

2 个答案:

答案 0 :(得分:1)

是的,你需要使用知识型序列化提示:

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

答案 1 :(得分: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();
    }

请记住你的子类必须有一个默认的构造函数,否则你将得到运行时序列化错误。