2013-07-16 18 views
10

Utilizzo un ApiController che utilizza la classe HttpConfiguration globale per specificare le impostazioni di JsonFormatter. Posso impostare globalmente le impostazioni di serializzazione come segue molto facilmente:Impostazioni serializzatore Json.NET personalizzate per tipo

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

Il problema è che non tutte le impostazioni si applicano a tutti i tipi nel mio progetto. Voglio specificare le opzioni TypeNameHandling e Binder personalizzate per tipi specifici che eseguono la serializzazione polimorfica.

Come è possibile specificare JsonFormatter.SerializationSettings su un tipo o almeno su base per-ApiController?

+1

Per config basato apicontroller, si può dare un'occhiata alla funzione di configurazione per-regolatore: http : //blogs.msdn.com/b/jmstall/archive/2012/05/11/per-controller-configuration-in-webapi.aspx. questo post è vecchio, ma la maggior parte delle cose dovrebbe essere rilevante anche per gli ultimi bit. –

+0

Ho provato a utilizzare la configurazione per controller utilizzando l'attributo IControllerConfiguration come suggerito. Le impostazioni che sto specificando nella funzione Initialize per JsonFormatter vengono effettivamente riutilizzate dalle richieste e vengono applicate ad altri controller. Ho applicato l'attributo solo a un controller particolare. Questo sembra un bug. –

risposta

12

Sulla base della sua commento di cui sopra, che segue è un esempio di configurazione per-regolatore:

[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

Pensi di potermi indirizzare nella giusta direzione per far funzionare questo argomento per Metodo di controllo? – WillFM

Problemi correlati