2016-06-09 19 views
0

Ich versuche, einen benutzerdefinierten XML-Deserializer zur ASP.Net Core-Pipeline für einen meiner Controller hinzuzufügen. Ich konnte es für JSON wie folgt tun:Deserialisieren von XML in Asp.NET Core MVC

public void ConfigureServices(IServiceCollection services) 
    { 
     // Add framework services. 
     services.AddMvc(); 
     services.Configure<MvcOptions>(options => 
     { 
      options.RespectBrowserAcceptHeader = true; 

      // Input formatters 
      var xmlInputFormatting = new XmlDataContractSerializerInputFormatter(); 
      var jsonInputFormatting = new JsonInputFormatter(); 
      jsonInputFormatting.SerializerSettings.Converters.Add(new BatchContentConverter()); 

      options.InputFormatters.Clear(); 
      options.InputFormatters.Add(jsonInputFormatting); 
      options.InputFormatters.Add(xmlInputFormatting); 
     } 
    } 

(viel unnötiger Code wurde der Kürze halber entfernt).

Die Controller-Aktion, wo dies am Ende sollte, ist:

public IActionResult Post([FromBody]IBatchContent batchContent) 
    { 
    } 

Gibt es eine Möglichkeit etwas ähnliches für XML entweder die XMLSerializerInputFormatter oder die XmlDataContractSerializerInputFormatter mit zu tun? Ich habe versucht, eine von DataContractResolver abstammende Klasse zu erstellen und sie der SerializerSettings.DataContractResolver-Eigenschaft zuzuweisen, aber sie scheint nie aufgerufen zu werden.

Antwort

1

Die Xml Formatierer sind nicht standardmäßig hinzugefügt. Sie müssten das Paket Microsoft.AspNetCore.Mvc.Formatters.Xml einschließen, die hat XmlSerializerInputFormatter, XmlSerializerOutputFormatter, XmlDataContractSerializerInputFormatter und XmlDataContractSerializerOutputFormatter

+0

ich tatsächlich sie das Hinzufügen bin Datei, ich tat sie nur aus dem Codebeispiel für Kürze: Ich versuche, herauszufinden, wie benutzerdefinierte De-Serialisierer zu ihnen auf die gleiche Weise hinzugefügt werden, die ich den BatchContentConverter für Json im Beispiel über hinzufügen –

+0

Sie versuchen, die vorhandenen (Serializer xmlserializer und DataContractserializer) anzupassen einige zu haben benutzerdefiniertes Verhalten? Wenn dies der Fall ist, sollten Sie die Fähigkeiten dieser Serialisierer überprüfen, da die Formatierer von MVC nur Wrapper um sie sind. Natürlich, wenn MVC einige Einstellungen freigibt, die Ihr Szenario ermöglichen würden, wäre das interessant. –

0

Sie müssen nur Folgendes tun:

  1. Erstellen Sie eine Klasse, die von der „XmlSerializerInputFormatter“ Klasse erbt in " Microsoft.AspNetCore.Mvc.Formatters "Namespace und überschreiben Sie die geschützte Methode" CreateSerializer ". Die Methodenzusammenfassung besagt "[diese Methode wird] während der Deserialisierung aufgerufen, um den System.Xml.Serialization.XmlSerializer abzurufen".

    public class IBatchCollectionXmlSerializer : XmlSerializerInputFormatter 
    { 
    
        protected override XmlSerializer CreateSerializer(Type type) 
        { 
         //init expected type 
         Type expectedType = typeof(IBatchContent); 
         //init xml serializer 
         XmlSerializer serializer = null; 
    
         //if not expected type 
         if (expectedType != type) 
         { 
          //return default serializer 
          serializer = base.CreateSerializer(type); 
         } 
         //if expected type 
         else 
         { 
          //add concrete type to deserialize to 
          Type[] extraTypes = new Type[] { typeof (BatchContentConcrete) }; 
          //create custom xml serializer here 
          serializer = new XmlSerializer(typeof(IBatchContent), extraTypes); 
         } 
    
         //return serializer 
         return serializer; 
        } 
    } 
    
  2. Fügen Sie diese auf Ihre Eingangsformatierer während mvc Dienstkonfiguration in Ihrer Startup.cs

    services.Configure<MvcOptions>(options => 
    { 
        options.RespectBrowserAcceptHeader = true; 
    
        // Input formatters 
        var xmlInputFormatting = new IBatchCollectionXmlSerializer(); 
        var jsonInputFormatting = new JsonInputFormatter(); 
        jsonInputFormatting.SerializerSettings.Converters.Add(new BatchContentConverter()); 
    
        options.InputFormatters.Clear(); 
        options.InputFormatters.Add(jsonInputFormatting); 
        options.InputFormatters.Add(xmlInputFormatting); 
    } 
    
Verwandte Themen