2

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 エラーだけです。

4

2 に答える 2

1

はい、既知のタイプのシリアル化のヒントを使用する必要があります。

[System.Runtime.Serialization.KnownType(typeof(Derived))]
public class Base
{
    public int ID { get; set; }
}
于 2012-07-13T19:54:53.777 に答える
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();
    }

子クラスにはデフォルトのコンストラクターが必要であることに注意してください。そうしないと、ランタイムのシリアル化エラーが発生します。

于 2014-02-20T13:10:36.660 に答える