2012-11-14 25 views
13

我有一個自主機的Web API與2個控制器:的ASP.NET Web API控制器具體串行

  • 對於控制器1,我需要默認的DataContractSerializer(我暴露EF 5 POCO)
  • 對於控制器2,我需要XmlFormatter設置爲true參數UseXmlSerializer(我露出一個XmlDocument)

我試圖設置控制器初始化過程中格式化,但配置似乎是全球性的,影響到所有的控制器:

public class CustomConfigAttribute : Attribute, IControllerConfiguration 
{ 
    public void Initialize(HttpControllerSettings settings, 
    HttpControllerDescriptor descriptor) 
    { 
     settings.Formatters.XmlFormatter.UseXmlSerializer = true; 

    } 
} 

我該如何解決這個問題?

回答

0

我想你可以寫一個自定義ActionFilterAttribute

OnActionExecuting中,將原始值保存在HttpContext中,然後在OnActionExecuted中恢復原始值。

+0

我想你的解決方案,但該格式是由控制器共享裝飾你的控制器。我可以收到兩個併發請求,每個控制器一個,產生UseXmlSerializer值不一致的問題。 – user1824269

0

控制器操作本身不應該關心數據如何被序列化。喲應該能夠請求數據和任何格式必要的操作來檢索數據將是相同的。

默認web api被序列化爲json對象。但是,如果將請求的內容類型設置爲xml,則返回的結果應該相同,但格式爲xml而不是json。

1

配置:

config.Formatters.Remove(config.Formatters.JsonFormatter); 
config.Formatters.Insert(0, new CustomXmlMediaTypeFormatter()); 

自定義格式:

public class CustomXmlMediaTypeFormatter : XmlMediaTypeFormatter 
{ 
    public CustomXmlMediaTypeFormatter() 
    { 
     UseXmlSerializer = true; 
    } 
} 

似乎工作,確定不是那麼優雅。 刪除默認的Xml格式化器不起作用, 所以我斷定該框架仍然在使用它。

+0

一直在尋找你的答案几個小時,現在是如此簡單。我只是不明白爲什麼這很難找到,我個人討厭DataContractSerializer。 https://msdn.microsoft.com/en-us/library/system.net.http.formatting.xmlmediatypeformatter.usexmlserializer(v=vs.118).aspx – bonitzenator

10

你是非常正確的軌道上。但是你需要在配置屬性中初始化一個新的XmlMediaTypeFormatter實例,否則你將影響全局引用。

如您所知,您需要基於IControllerConfiguration接口創建2個屬性。

public class Controller1ConfigAttribute : Attribute, IControllerConfiguration 
{ 
    public void Initialize(HttpControllerSettings controllerSettings, 
          HttpControllerDescriptor controllerDescriptor) 
    { 
     var xmlFormater = new XmlMediaTypeFormatter {UseXmlSerializer = true}; 

     controllerSettings.Formatters.Clear(); 
     controllerSettings.Formatters.Add(xmlFormater); 
    } 
} 

public class Controller2ConfigAttribute : Attribute, IControllerConfiguration 
{ 
    public void Initialize(HttpControllerSettings controllerSettings, 
          HttpControllerDescriptor controllerDescriptor) 
    { 
     var xmlFormater = new XmlMediaTypeFormatter(); 
     controllerSettings.Formatters.Clear(); 
     controllerSettings.Formatters.Add(xmlFormater); 
    } 
} 

然後與相關的屬性

[Controller1ConfigAttribute] 
public class Controller1Controller : ApiController 
{ 

[Controller2ConfigAttribute] 
public class Controller2Controller : ApiController 
{ 
+0

非常有幫助和重點。 –