2

WebAPIは着信リクエストのAccept:ヘッダーを無視しており、POCOオブジェクトを常にJSONとしてシリアル化しているようです。WizTools RestClientを使用してAPI呼び出しをテストし、リクエストHTTPヘッダーを設定しています。

GET /api/people/evh123
Accept: application/xml

コントローラを変更してリターンstring[]またはその他のネイティブタイプにすると、期待どおりにXMLが取得されます。私のApplication_Start()メソッドにこの行を追加することを提案する人が何人かいます。

GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true;

しかし、私の場合、これは何の違いもありません。

私のAPIコントローラー:

using System.Web.Http;
using Spyglass.Api.Entities;

namespace Spyglass.Api.Controllers {
    public class PeopleController : ApiController {

        public Person Get(string personId) {
            var member = new Person(personId) { FullName = "Eddie van Halen" };
            return (member);
        }
    }
}

私のルート設定:

using System.Web.Http;

namespace Spyglass.Api {
    public static class WebApiConfig {
        public static void Register(HttpConfiguration config) {
            config.Routes.MapHttpRoute(
                name: "PeopleApi",
                routeTemplate: "api/people/{personId}/{controller}/{id}",
                defaults: new {id = RouteParameter.Optional, controller = "People"}
                );
        }
    }
}

私のPOCO:

namespace Spyglass.Api.Entities {
    public class Person {
        public string PersonId { get; set; }
        public string FullName { get; set; }

        public Person(string personId) {
            this.PersonId = personId;
        }
    }
}

POCOのカスタムシリアル化構成のようなものがありませんか?通常XMLシリアライザーの頭痛の種となる循環参照や複雑な型はありません...何かアイデアはありますか?

4

2 に答える 2

6

[DataContract] および [DataMember] 属性でオブジェクトを装飾する必要があります

[DataContract]
public class Person
{

    [DataMember]
    public string PersonId { get; set; }

    [DataMember]
    public string FullName { get; set; }

    public Person(string id)
    {
        PersonId = id;
    }
}

または、POCO にデフォルトのパラメーターなしのコンストラクターがあることを確認してください。これは DataContractSerializer の制限です。別のシリアライザーを使用することもできます。

于 2013-03-05T13:05:00.033 に答える
-2

global.asx.cs から json フォーマッタを削除してみてください。

GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.JsonFormatter);

これにより、XML フォーマッタのみがそのまま残ります。

于 2013-03-05T11:53:53.637 に答える