2013-07-16 12 views
10

Używam apiController, który używa globalnej klasy HttpConfiguration do określenia ustawień JsonFormatter. Mogę bardzo łatwo skonfigurować ustawienia serializacji w następujący sposób:Niestandardowe ustawienia serializatora Json.NET na typ

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

Problem polega na tym, że nie wszystkie ustawienia dotyczą wszystkich typów w moim projekcie. Chcę określić niestandardowe opcje TypeNameHandling i Binder dla określonych typów wykonujących serializację polimorficzną.

Jak mogę określić JsonFormatter.SerializationSettings na jeden typ lub co najmniej na podstawie ApiController?

+1

Dla konfiguracji opartej apicontroller, można spojrzeć na funkcję konfiguracji per-kontrolera: http : //blogs.msdn.com/b/jmstall/archive/2012/05/11/per-controller-configuration-in-webapi.aspx. ten post jest stary, ale większość rzeczy powinna być odpowiednia także dla najnowszych bitów. –

+0

Próbowałem odwoływać się do konfiguracji kontrolera za pomocą atrybutu IControllerConfiguration, tak jak zasugerowałeś. Ustawienia, które określam w funkcji Initialize dla JsonFormatter, są w rzeczywistości ponownie wykorzystywane przez żądania i są stosowane do innych kontrolerów. Zastosowałem tylko atrybut do jednego konkretnego kontrolera. To wygląda na błąd. –

Odpowiedz

12

Bazując na swoim komentarzu powyżej, po to przykład konfiguracji per-kontrolera:

[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); 
    } 
} 
+0

Czy myślisz, że możesz wskazać mi właściwy kierunek, aby ten argument działał zgodnie z metodą kontrolera? – WillFM

Powiązane problemy