0

JSONではなくXMLを返すように、Web APIコントローラー内でアクションを構成するにはどうすればよいですか?

XmlElement属性を持つUserProfileオブジェクトを返すアクションがあります。

[HttpGet]
        public UserProfile SearchByEmail(string siteName, string email)
        {
            var userProfile = this._profileFinderByEmail.Find(siteName, email);

            if (userProfile == null)
            {
                throw new HttpResponseException(HttpStatusCode.NotFound);
            }

            return userProfile;
        }

このアクションを実行すると、xmlではなくapplication/jsonが返されます。どうすればxmlを返すことができますか?

Fiddlerから判断すると、私が送信していたリクエストヘッダーには、以下のAcceptヘッダーキーがありました。

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

xmlを返すことを期待していましたが、そうではありません。

それを修正する方法は?

また、WebApiConfigクラスに以下の値を設定しました。

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

Chrome /ネットワークタブから見ると、以下のエラーが表示されます。

Status Code:406 Not Acceptable
4

1 に答える 1

1

ヘッダーは正しいように見えるので、最初にフォーマッターがそこにあるかどうかを確認する必要があります。次のスニペットを使用して、登録されているすべてのフォーマッターを出力できます(アクションメソッド内で使用できます)。

foreach (var formatter in GlobalConfiguration.Configuration.Formatters)
{
    System.Diagnostics.Debug.WriteLine(String.Format("{0}: {1}", formatter.GetType().Name, String.Join(", ", formatter.SupportedMediaTypes.Select(x=>x.MediaType))));
}

結果は、 Visual Studioの[出力]ウィンドウに表示されます([出力の表示]を[デバッグ]に設定します)。次のような行を探す必要があります。

XmlMediaTypeFormatter: application/xml, text/xml

そこにない場合は、それが何らかの理由で削除されたことを意味し、アプリケーションでコードのその部分を見つける必要があります。そこにある場合はDataContractSerializer、エンティティをシリアル化できなかったことを意味している可能性があります(サポートされているタイプの詳細については、こちらをご覧ください)。

XmlElementまた、エンティティで属性を使用しているとのことです。デフォルトXmlMediaTypeFormatterではDataContractSerializer(上記のように)これらの属性を無視するを使用しています。に切り替えたい場合XmlSerializerは、次のコードを使用できます(たとえば、でGlobal.asax)。

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

もちろんXmlSerializer、注意する必要のある独自の制限があります。

于 2013-03-25T10:21:58.707 に答える