私はあなたの2 JSONsはどのように多くの異なる全くわからないとまさにあなたも一緒にやっている、しかし、あなたは私に言わせれば、私はフォーマッタでそれを行うだろう:
public class MyJsonMediaTypeFormatter : JsonMediaTypeFormatter
{
private IHttpRouteData _route;
public override MediaTypeFormatter GetPerRequestFormatterInstance(Type type, HttpRequestMessage request, System.Net.Http.Headers.MediaTypeHeaderValue mediaType)
{
_route = request.GetRouteData();
return base.GetPerRequestFormatterInstance(type, request, mediaType);
}
public override System.Threading.Tasks.Task WriteToStreamAsync(Type type, object value, System.IO.Stream writeStream, HttpContent content, TransportContext transportContext)
{
if (_route.Route.RouteTemplate.Contains("legacy"))
{
//here set the SerializerSettings for non standard JSON
//I just added NullValueHandling as an example
this.SerializerSettings = new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore
};
}
return base.WriteToStreamAsync(type, value, writeStream, content, transportContext);
}
}
あなたはでしょうデフォルトのJsonMEdiaTypeFormatterをこのものに置き換えます。あなたが唯一の特定のルート上で動作しますが、Formatters
コレクションがグローバルであるため、その実行時でさえroute-から変更するにはポイントがありませんので、それは本当に意味がないDelegatingHandler
を持つことができたWeb APIで
config.Formatters.RemoveAt(0);
config.Formatters.Insert(0, new MyJsonMediaTypeFormatter());
スコープ付きハンドラです。
ええ、私はカスタムMediaTypeFormatterの使用を検討していました。上のあなたの例は私が達成しようとしているものと同じです。しかし、私は、ロジックを導入することによって、アプリケーションのロジックがかなりアプリケーションに依存しないものになることに懸念しています。私は知っている、あなたの解決策は確かに機能するだろう - しかし、私の純粋主義者は、私の懸念をよく、本当に分かち合うのが好きです。 –
コントローラごとの設定(* IControllerConfiguration * http://blogs.msdn.com/b/jmstall/archive/2012/05/11/per-controller-configuration-in-webapi.aspx)を使用してこれを登録することができますそれが適用される1つのコントローラの "カスタム"フォーマッタのみ。このように、コアアプリケーションはデフォルトのフォーマッタを使用しますが、より多くの要件を持つコントローラは特定のフォーマッタを使用します。 –
実際にアクションフィルタを使用する方法と実際にどのように違うのかは実際にはわかりません。実際には、IControllerConfiguration属性を使ってこれを達成できるかどうかわからないのは、ルート情報/要求コンテキスト情報にアクセスできないためです。 –