Подтвердить что ты не робот

Конкретный сериализатор веб-API ASP.NET

У меня есть собственный веб-API с двумя контроллерами:

  • Для контроллера 1 мне нужен DataContractSerializer по умолчанию (я подвергаю EF 5 POCO)
  • Для контроллера 2 мне нужен XmlFormatter с параметром UseXmlSerializer, установленным в true (я выставляю XmlDocument)

Я пытался установить formatters во время инициализации контроллера, но конфигурация кажется глобальной, затрагивая все контроллеры:

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

    }
}

Как я могу это решить?

4b9b3361

Ответ 1

Ты был на правильном пути. Но вам нужно инициализировать новый экземпляр XmlMediaTypeFormatter в ваших конфигурационных атрибутах, иначе вы повлияете на глобальную ссылку.

Как вам известно, вам нужно создать 2 атрибута на основе интерфейса IControllerConfiguration.

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
{

Ответ 2

Конфигурация:

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

Пользовательский форматтер:

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

Этот кажется работать, но не очень элегантный. Удаление стандартного Xml Formatter не работает, поэтому я пришел к выводу, что структура каким-то образом все еще использует его.

Ответ 3

Я думаю, вы могли бы написать пользовательский ActionFilterAttribute.

В OnActionExecuting сохраните исходные значения в HttpContext, а затем в OnActionExecuted, восстановите исходные значения.

Ответ 4

сами действия контроллеров не должны касаться того, как данные сериализуются. yo должно быть в состоянии запросить данные и любой формат, необходимый для получения данных, будет одинаковым.

по умолчанию web api, сериализованный для json-объектов. однако, если вы задаете тип содержимого запроса в xml, он должен вернуть тот же результат, но отформатирован как xml вместо json.