принудительно возвращать xml на некоторых контроллерах веб-API при сохранении JSON по умолчанию

Мы выполняем некоторую интеграцию с лазурным магазином, и его код поставщика ресурсов требует, чтобы мы использовали xml в качестве средства форматирования возврата. Однако мы хотим использовать XML только с материалами Azure и оставить стандартное средство форматирования JSON в покое.

Итак, кто-нибудь знает, как заставить веб-API для определенных контроллеров/методов всегда возвращать xml, не связываясь с глобальными форматировщиками при запуске приложения?

Работая с MVC 4.5 и кодом, в основном основанным на https://github.com/MetricsHub/AzureStoreRP, я просто переместили материал веб-API в наши собственные службы и изменили уровень данных, чтобы использовать наш бэкэнд, а не бэкэнд фреймворка сущностей, который у него есть.


person danatcofo    schedule 22.07.2013    source источник


Ответы (1)


Если вы хотите всегда отправлять обратно Xml из определенного действия, вы можете просто сделать следующее:

public HttpResponseMessage GetCustomer(int id)
{
    Customer customer = new Customer() { Id  =1, Name = "Michael" };

    //forcing to send back response in Xml format
    HttpResponseMessage resp = Request.CreateResponse<Customer>(HttpStatusCode.OK, value: customer,
        formatter: Configuration.Formatters.XmlFormatter);

    return resp;
}

У вас могут быть средства форматирования, специфичные только для определенных контроллеров. Этого можно достичь с помощью функции под названием Per-Controller Configuration:

[MyControllerConfig]
public class ValuesController : ApiController

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = true)]
public class MyControllerConfigAttribute : Attribute, IControllerConfiguration
{
    public void Initialize(HttpControllerSettings controllerSettings, HttpControllerDescriptor controllerDescriptor)
    {
        // yes, this instance is from the global formatters
        XmlMediaTypeFormatter globalXmlFormatterInstance = controllerSettings.Formatters.XmlFormatter;

        controllerSettings.Formatters.Clear();

        // NOTE: do not make any changes to this formatter instance as it reference to the instance from the global formatters.
        // if you need custom settings for a particular controller(s), then create a new instance of Xml formatter and change its settings.
        controllerSettings.Formatters.Add(globalXmlFormatterInstance);
    }
}
person Kiran Challa    schedule 22.07.2013
comment
Второй пример - это то, что я ищу. Это большое спасибо! - person danatcofo; 22.07.2013
comment
@Kiran: Мне бы очень хотелось, чтобы ваш второй пример был встроен в фреймворк - он работает отлично! Очень простое решение, молодец. - person Trevor.Screws; 03.04.2018