ASP.NET Web API Controller Specific Serializer

asp.net, asp.net-web-api, xml, xml-serialization

Solution

You were very much on the right track. But you need to initallise a new instance of the `XmlMediaTypeFormatter` in your config attributes otherwise you will affect the global reference.

As you know, you need to create 2 attributes based on the `IControllerConfiguration` interface.

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);
    }
}

Then decorate your controllers with the relevant attribute

[Controller1ConfigAttribute]
public class Controller1Controller : ApiController
{

[Controller2ConfigAttribute]
public class Controller2Controller : ApiController
{

Problem

I've a self host Web API with 2 controllers: - For controller 1, I need default DataContractSerializer (I'm exposing EF 5 POCO) - For controller 2, I need XmlFormatter with parameter UseXmlSerializer set to true (I'm exposing an XmlDocument) I've tried to set formatters during controller initialization, but the configuration seems to be global, affecting all controllers: ``` public class CustomConfigAttribute : Attribute, IControllerConfiguration { public void Initialize(HttpControllerSettings settings, HttpControllerDescriptor descriptor) { settings.Formatters.XmlFormatter.UseXmlSerializer = true; } } ``` How can I solve this?

Original source