5

WCF Web Api でホストされている一連のサービスがあり、javascript から JSON でそれらと通信します。ほとんどの場合、ヘッダーの受け入れビットを変更して JSON 応答を要求しても問題ありませんが、これができない場合もあります。これは、私が使用している JavaScript フレームワーク (Ext JS) によるものです。いくつかの場合、ヘッダーなどのプロキシのデフォルトではなく、URL のみを指定できます。

ただし、これは Ext JS に関する質問ではありません。Web Api はデフォルトで XML を返すようです。このデフォルトを変更して、代わりに JSON を返すことができるかどうかを知りたいです。前もって感謝します!

4

4 に答える 4

4

少し実験してみると、構成されたフォーマッターの順序が重要であることがわかります(これは非常に直感的です)。

デフォルトでは、のインスタンスを作成するとHttpConfiguration、そのFormattersコレクションには次のフォーマッターが含まれます。

  1. XmlMediaTypeFormatter
  2. JsonValueMediaTypeFormatter
  3. JsonMediaTypeFormatter
  4. FormUrlEncodedMediaTypeFormatter

XMLがデフォルトのフォーマットである理由は、XMLが最初のフォーマッターであるためです。JSONをデフォルト値にするには、コレクションを次のように並べ替えることができます。

  1. JsonValueMediaTypeFormatter
  2. JsonMediaTypeFormatter
  3. XmlMediaTypeFormatter
  4. FormUrlEncodedMediaTypeFormatter

configHttpConfigurationのインスタンスが与えられた場合、コレクションを並べ替える1つの方法は次のとおりです。

var jsonIndex = Math.Max(
    config.Formatters.IndexOf(config.Formatters.JsonFormatter),
    config.Formatters.IndexOf(config.Formatters.JsonValueFormatter));
var xmlIndex = config.Formatters.IndexOf(
    config.Formatters.XmlFormatter);

config.Formatters.Insert(jsonIndex + 1, config.Formatters.XmlFormatter);
config.Formatters.RemoveAt(xmlIndex);

これがサポートされているかどうかはわかりませんが、WebApi0.6.0で動作するようです。

于 2012-01-25T11:40:25.960 に答える
3

私は実際にこれに対処する簡単な方法を見つけました。まず、デフォルトの JSON フォーマッタが最初であることを確認してください。次に、そのタイプを text/html に設定します。これにより、ヘッダーが設定されていない場合でも、ブラウザが JSON を取得することが保証されます。以下の優れた点は、クライアント コードで accept ヘッダーを設定することを覚えておく必要がないことです。それは機能し、常にデフォルトで JSON になります。

var jsonformatter = config.Formatters.Where(t => t.GetType() == typeof(JsonMediaTypeFormatter)).FirstOrDefault());
config.Formatters.Remove(jsonformatter );
config.Formatters.Insert(0, jsonformatter); 
config.Formatters[0].SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
于 2012-04-17T19:08:39.327 に答える
2

ここで説明されているように、委任チャネルを使用できますhttp://blog.alexonasp.net/post/2011/07/26/Look-Ma-I-can-handle-JSONP-(aka-Cross-Domain-JSON)- with-WCF-Web-API-and-jQuery!.aspxは、 http://myserver/myresource/1/jsonのような URI を http://myserver/myresource/1 にマップし accept ヘッダーを application/json に設定します。

http://wcf.codeplex.comから WCF Web API をダウンロードする場合、委任チャネルは ContactManager_Advanced サンプルの一部です。

これは、UriFormatExtensionMessageChannel.cs ファイルに含まれています。

実行方法については、サンプルの global.asax.cs を参照してください。

于 2011-07-26T20:13:49.913 に答える
1

コードによると、WCF Web API は、使用可能なフォーマッタのコレクションにある場合、常に XmlFormatter にデフォルト設定されます。そうでない場合、これが存在する場合は代わりに JsonFormatter が使用されます。DefaultFormatter プロパティもありますが、これは内部的なものであるため、設定できません。たぶん、追加するのに役立つ機能リクエストですか?

于 2011-07-22T08:42:40.430 に答える