Конкретный сериализатор веб-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;
}
}
Как я могу это решить?
Ответы
Ответ 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.