ASP.NET Web API控制器特定的序列化程序

use*_*269 13 xml asp.net xml-serialization asp.net-web-api

我有一个带有2个控制器的自主Web API:

  • 对于控制器1,我需要默认DataContractSerializer(我暴露EF 5 POCO)
  • 对于控制器2,我需要XmlFormatter,参数UseXmlSerializer设置为true(我暴露了一个XmlDocument)

我试图在控制器初始化期间设置格式化程序,但配置似乎是全局的,影响所有控制器:

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

    }
}
Run Code Online (Sandbox Code Playgroud)

我怎么解决这个问题?

Mar*_*nes 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后使用相关属性装饰控制器

[Controller1ConfigAttribute]
public class Controller1Controller : ApiController
{

[Controller2ConfigAttribute]
public class Controller2Controller : ApiController
{
Run Code Online (Sandbox Code Playgroud)


Dan*_*ite 0

我认为你可以写一个自定义ActionFilterAttribute

在 中OnActionExecuting,将原始值存储在 HttpContext 中,然后在 中OnActionExecuted,恢复原始值。