背景:特定のヘッダーが渡されたときにJSONオブジェクトへの応答の出力を変更する属性を使用しています。別の属性は、適切なacceptヘッダーが渡されたときにXMLを返します。acceptヘッダーがないか、「html」の場合、テストページが返されます。
次のようなオブジェクト構造をシリアル化できる必要があります。
[DataContract]
public class ResponseModel
{
[DataMember]
public bool Success { get; set;}
[DataMember]
public dynamic Data { get; set; } //I have tried "Object" as well
[DataMember]
public ApiErrorModel Error { get; set; }
}
//for reference
[DataContract]
public class ApiErrorModel
{
[DataMember]
public string ErrorCode { get; set; }
[DataMember]
public string ErrorMessage { get; set; }
}
私が抱えている問題は、エラー状態をまだテストできていないときに、次のような構造をシリアル化する場合です。
[DataContract]
public class DatabaseModel
{
[DataMember]
List<Database> Database { get; set; }
//snip implementation
}
[DataContract]
public class Database
{
[DataMember]
[Required]
public string DatabaseName { get; set; }
[DataMember]
List<Guid> APITokens { get; set; }
//snip other fields..., Guids and strings...
}
それは失敗し、私にエラーを与えます:
「[namespace].Api.Business.Web.Models.DatabaseModel」と入力し、データコントラクト名は「DatabaseModel:http://schemas.datacontract.org/2004/07/ [namespace].Api.Business.Web.Models」です。期待できません。DataContractResolverを使用するか、既知のタイプのリストに静的に不明なタイプを追加することを検討してください。たとえば、KnownTypeAttribute属性を使用するか、DataContractSerializerに渡される既知のタイプのリストに追加します。
DataContractResolverを使用して調査しましたが、JSONバージョンで動作させることができないようです。JSON.NETまたはJavaScriptSerializerシリアライザーに切り替える方が簡単な場合がありますが、XMLでも機能する必要があります(これはJSON固有の問題である可能性があります)。既知のタイプのシリアル化メソッドリストに使用するすべてのタイプのリストを追加せずに、これを修正する方法があるかどうか疑問に思っています。