2016-06-09 61 views
0

我想添加一個自定義的xml解串器到我的控制器之一的ASP.Net核心管道。我已經能夠這樣做JSON像這樣:反序列化Asp.NET核心中的XML 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); 
     } 
    } 

(很多不必要的代碼已被刪除爲簡潔起見)。

控制器動作,其中本應該結束了是:

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

有沒有辦法做到的使用無論是XMLSerializerInputFormatter或XmlDataContractSerializerInputFormatter XML相似的地方?我試着創建一個從DataContractResolver後裔的類,並將其分配給SerializerSettings.DataContractResolver屬性,但它似乎永遠不會被調用。

回答

1

默認情況下,Xml格式器是而不是。您將需要包括具有XmlSerializerInputFormatter,XmlSerializerOutputFormatter,XmlDataContractSerializerInputFormatter和XmlDataContractSerializerOutputFormatter

Microsoft.AspNetCore.Mvc.Formatters.Xml
+0

其實我加入他們,我只是刪除他們從簡潔的代碼示例:我試圖找出如何添加自定義反序列化程序給他們以同樣的方式,我在上面的示例中爲Json添加BatchContentConverter –

+0

您試圖自定義現有的(xmlserializer和datacontractserializer)序列化程序有一些自定義行爲?如果是這樣,你應該檢查這些序列化程序的功能,因爲MVC的格式化程序只是對它們的封裝。當然,如果MVC沒有公開某些可以啓用你的場景的設置,那很有趣。 –

0

你只需要做到以下幾點:

  1. 創建從「發現「XmlSerializerInputFormatter」類繼承的類Microsoft.AspNetCore.Mvc.Formatters「命名空間並覆蓋受保護的方法」CreateSerializer「。方法摘要指出「[此方法是]在反序列化過程中調用以獲取System.Xml.Serialization.XmlSerializer」。

    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. 這對您輸入格式化MVC服務配置過程中您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); 
    }