2012-11-14 6 views
13

ich eine Selbst Host Web API mit 2 Controllern haben:ASP.NET Web API-Controller Spezifische Serializer

  • Für Regler 1, I Standard DataContractSerializer müssen (ich EF aussetzt 5 POCO)
  • Für 2-Controller, ich brauche XMLFormatter mit dem Parameter UseXmlSerializer auf true gesetzt (ich Belichtung eines XmlDocument)

ich habe versucht Formatierer während Reglerinitialisierung zu setzen, aber die Konfiguration scheint global zu sein, alle Regler beeinflussen:

public class CustomConfigAttribute : Attribute, IControllerConfiguration 
{ 
    public void Initialize(HttpControllerSettings settings, 
    HttpControllerDescriptor descriptor) 
    { 
     settings.Formatters.XmlFormatter.UseXmlSerializer = true; 

    } 
} 

Wie kann ich das lösen?

Antwort

0

Ich denke, Sie könnten eine benutzerdefinierte ActionFilterAttribute schreiben.

In OnActionExecuting die ursprünglichen Werte im HttpContext speichern und dann in OnActionExecuted die ursprünglichen Werte wiederherstellen.

+0

Ich habe versucht, Ihre Lösung dekorieren aber die Formatierer von den Controllern gemeinsam genutzt wird. Ich kann zwei gleichzeitige Anfragen erhalten, eine pro Controller, was zu Inkonsistenzen im Wert von UseXmlSerializer führt. – user1824269

0

Die Controller-Aktionen selbst sollten nicht darauf achten, wie die Daten serialisiert werden. Sie sollten in der Lage sein, die Daten und jedes Format anzufordern, das notwendig ist, um die Daten abzurufen.

standardmäßig Web-API serialisiert zu JSON-Objekten. Wenn Sie jedoch den Inhaltstyp der Anfrage auf xml setzen, sollte iS das gleiche Ergebnis liefern, aber als xml anstelle von json formatiert sein.

1

Konfiguration:

config.Formatters.Remove(config.Formatters.JsonFormatter); 
config.Formatters.Insert(0, new CustomXmlMediaTypeFormatter()); 

Die Custom-Formatierer:

public class CustomXmlMediaTypeFormatter : XmlMediaTypeFormatter 
{ 
    public CustomXmlMediaTypeFormatter() 
    { 
     UseXmlSerializer = true; 
    } 
} 

Diese scheint zu arbeiten, ok nicht so elegant. Das Entfernen von Xml Formatter funktioniert nicht, , also kam ich zu dem Schluss, dass das Framework es immer noch benutzt.

+0

Seit mehreren Stunden auf der Suche nach Ihrer Antwort, ist es jetzt so einfach. Ich kann nicht verstehen, warum das so schwer zu finden war, ich persönlich hasse den DataContractSerializer. https://msdn.microsoft.com/en-us/library/system.net.http.formatting.xmlmediatypeformatter.usexmlserializer(v=vs.118).aspx – bonitzenator

10

Sie waren sehr auf dem richtigen Weg. Sie müssen jedoch eine neue Instanz von XmlMediaTypeFormatter in Ihren Konfigurationsattributen initialisieren, ansonsten werden Sie die globale Referenz beeinflussen.

Wie Sie wissen, müssen Sie 2 Attribute basierend auf der IControllerConfiguration Schnittstelle erstellen.

public class Controller1ConfigAttribute : Attribute, IControllerConfiguration 
{ 
    public void Initialize(HttpControllerSettings controllerSettings, 
          HttpControllerDescriptor controllerDescriptor) 
    { 
     var xmlFormater = new XmlMediaTypeFormatter {UseXmlSerializer = true}; 

     controllerSettings.Formatters.Clear(); 
     controllerSettings.Formatters.Add(xmlFormater); 
    } 
} 

public class Controller2ConfigAttribute : Attribute, IControllerConfiguration 
{ 
    public void Initialize(HttpControllerSettings controllerSettings, 
          HttpControllerDescriptor controllerDescriptor) 
    { 
     var xmlFormater = new XmlMediaTypeFormatter(); 
     controllerSettings.Formatters.Clear(); 
     controllerSettings.Formatters.Add(xmlFormater); 
    } 
} 

Dann Ihre Controller mit dem entsprechenden Attribut

[Controller1ConfigAttribute] 
public class Controller1Controller : ApiController 
{ 

[Controller2ConfigAttribute] 
public class Controller2Controller : ApiController 
{ 
+0

Wunderbar hilfreich und auf den Punkt. –

Verwandte Themen