2015-02-06 87 views
1

我想从我的项目中的全局格式化程序中删除XmlFormatter。我这样做吧:WebApi:将MediaTypeFormatter附加到控制器

var formatters = GlobalConfiguration.Configuration.Formatters; 
formatters.Remove(formatters.XmlFormatter) 

但在同一时间,我想有一个控制器,它能够返回xml数据类型。是否有可能装饰我的控制器具有特定属性或以某种方式将XmlFormatter专门附加到此控制器?

回答

2

您需要创建一个自定义System.Net.Http.Formatting.IContentNegotiator类,并将所选格式器检入Negotiate方法中。

public class ApplicationContentNegotiator : IContentNegotiator 
{ 
    private readonly JsonMediaTypeFormatter _jsonFormatter; 
    private readonly MediaTypeHeaderValue _jsonMediaType; 

    private readonly XmlMediaTypeFormatter _xmlFormatter; 
    private readonly MediaTypeHeaderValue _xmlMediaType; 

    public static IContentNegotiator Create() 
    { 
     return new ApplicationContentNegotiator(); 
    } 

    private ApplicationContentNegotiator() 
    { 
     _jsonFormatter = new JsonMediaTypeFormatter(); 
     _jsonMediaType = MediaTypeHeaderValue.Parse("application/json"); 

     _xmlFormatter = new XmlMediaTypeFormatter(); 
     _xmlMediaType = MediaTypeHeaderValue.Parse("application/xml"); 
    } 

    public ContentNegotiationResult Negotiate(Type type, HttpRequestMessage request, IEnumerable<MediaTypeFormatter> formatters) 
    { 
     var controller = new DefaultHttpControllerSelector(request.GetConfiguration()).SelectController(request); 
     if (controller.ControllerName == "MyController") 
      return new ContentNegotiationResult(_xmlFormatter, _xmlMediaType); 

     return new ContentNegotiationResult(_jsonFormatter, _jsonMediaType); 
    } 
} 

然后更换您IContentNegotiator实施服务为HttpConfiguration对象

GlobalConfiguration.Configuration.Services.Replace(typeof(IContentNegotiator), ApplicationContentNegotiator.Create()); 
+0

谢谢阿尔贝托,很好的解决方案。但我们决定使用另一种方法。 – 2015-02-10 11:28:06

+0

@IvanKononenko有什么办法? :) – RyanY 2016-02-17 03:59:14

相关问题