Пользовательские настройки сериализатора Json.NET для каждого типа

Я использую ApiController, который использует глобальный класс HttpConfiguration для указания настроек JsonFormatter. Я могу очень легко установить глобальные настройки сериализации следующим образом:

config.Formatters.JsonFormatter.SerializerSettings.PreserveReferencesHandling = PreserveReferencesHandling.Objects;

Проблема в том, что не все настройки применимы ко всем типам в моем проекте. Я хочу указать настраиваемые параметры TypeNameHandling и Binder для конкретных типов, выполняющих полиморфную сериализацию.

Как я могу указать JsonFormatter.SerializationSettings для каждого типа или, по крайней мере, для каждого ApiController?


person Trevor Elliott    schedule 16.07.2013    source источник
comment
Для конфигурации на основе API-контроллера вы можете взглянуть на функцию конфигурации для каждого контроллера: blogs.msdn.com/b/jmstall/archive/2012/05/11/ . этот пост старый, но большая часть материала должна быть актуальна и для последних битов.   -  person Kiran Challa    schedule 16.07.2013
comment
Я попытался прибегнуть к конфигурации для каждого контроллера, используя атрибут IControllerConfiguration, как вы предложили. Настройки, которые я указываю в функции Initialize для JsonFormatter, на самом деле повторно используются запросами и применяются к другим контроллерам. Я применил атрибут только к одному конкретному контроллеру. Это похоже на ошибку.   -  person Trevor Elliott    schedule 17.07.2013


Ответы (1)


Основываясь на вашем комментарии выше, ниже приведен пример конфигурации для каждого контроллера:

[MyControllerConfig]
public class ValuesController : ApiController

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = true)]
public class MyControllerConfigAttribute : Attribute, IControllerConfiguration
{
    public void Initialize(HttpControllerSettings controllerSettings, HttpControllerDescriptor controllerDescriptor)
    {
        //remove the existing Json formatter as this is the global formatter and changing any setting on it
        //would effect other controllers too.
        controllerSettings.Formatters.Remove(controllerSettings.Formatters.JsonFormatter);

        JsonMediaTypeFormatter formatter = new JsonMediaTypeFormatter();
        formatter.SerializerSettings.PreserveReferencesHandling = PreserveReferencesHandling.All;
        controllerSettings.Formatters.Insert(0, formatter);
    }
}
person Kiran Challa    schedule 17.07.2013
comment
Как вы думаете, вы могли бы указать мне правильное направление, чтобы заставить этот аргумент работать на метод контроллера? - person WillFM; 03.04.2014