标题或多或少说明了一切。 我试图配置JSON MediaTypeFormatter以使每条路线的行为不同。
具体来说,我的WebAPI中有两条路由映射到同一个控制器。 每条路线执行相同的操作并返回相同的数据,但出于与现有消费者向后兼容的原因,他们必须对输出格式略有不同。
我可以在Controller中放置一些代码,以确定请求是在传统路由还是新路由中进行的,并相应地更改格式化程序。
我还可以使用ActionFilter来更改所需的格式化程序。
但我想知道是否有办法在每个路由级别配置格式化程序,因为这是我的API行为不同的抽象级别。这可以是路径配置点,也可以是代理处理程序。
有什么建议吗?
答案 0 :(得分:6)
我不完全确定你的两个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 API中,您可以DelegatingHandler
仅在特定路由上运行,但由于Formatters
集合是全局的,因此没有任何意义,所以在运行时甚至没有必要修改它来自路由范围的处理程序。