2013-07-16 9 views
10

Ich verwende einen ApiController, der die globale HttpConfiguration-Klasse verwendet, um die JsonFormatter-Einstellungen anzugeben. Ich kann global Serialisierung Einstellungen wie folgt sehr leicht:Benutzerdefinierte Json.NET-Serializer-Einstellungen pro Typ

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

Das Problem ist, dass nicht alle Einstellungen für alle Arten in meinem Projekt anwenden. Ich möchte benutzerdefinierte TypeNameHandling- und Binder-Optionen für bestimmte Typen angeben, die eine polymorphe Serialisierung durchführen.

Wie kann ich JsonFormatter.SerializationSettings pro Typ oder mindestens auf Pro-ApiController-Basis angeben?

+1

Für apicontroller basierte config Sie einen Blick auf pro-Controller-Konfiguration Funktion übernehmen kann: http : //blogs.msdn.com/b/jmstall/archive/2012/05/11/per-controller-configuration-in-webapi.aspx. Dieser Post ist ein alter, aber die meisten Sachen sollten auch für die neuesten Bits relevant sein. –

+0

Ich habe versucht, pro-Controller-Konfiguration mit dem IControllerConfiguration-Attribut, wie Sie vorgeschlagen haben. Die Einstellungen, die ich in der Initialize-Funktion für den JsonFormatter angeben, werden tatsächlich von Anforderungen wiederverwendet und auf andere Controller angewendet. Ich habe das Attribut nur auf einen bestimmten Controller angewendet. Das scheint ein Fehler zu sein. –

Antwort

12

Basierend auf Ihren Kommentar oben, finden Sie ein Beispiel für pro-Controller-Konfiguration:

[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

Glaubst du, du könntest mir in die richtige Richtung zeigen, damit dieses Argument pro Controller-Methode funktioniert? – WillFM

Verwandte Themen