あなたの 2 つの JSON がどのくらい違うのか、そしてそれらをどう扱っているのかは完全にはわかりませんが、私に尋ねられたら、フォーマッターでそれを行います。
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 をこれに置き換えます。
config.Formatters.RemoveAt(0);
config.Formatters.Insert(0, new MyJsonMediaTypeFormatter());
Web APIDelegatingHandler
では、特定のルートでのみ実行することができますが、Formatters
コレクションはグローバルであるため、実際には意味がありません。ルートスコープのハンドラーからでも実行時に変更する意味はありません。