2016-06-09 58 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); 
    }