.net webapi接收xml格式数据的3种情况小结

请看下面的攻略。

.NET WebAPI接收XML格式数据的3种情况小结

在Web应用程序中,接收XML格式数据是非常常见的操作。在.NET WebAPI中,我们可以通过多种方式来接收XML格式数据,下面将介绍其中的3种情况。

1. 直接读取RequestBody

直接读取Request的Body,把XML转换为对应的对象或集合:

public HttpResponseMessage Post(HttpRequestMessage request)
{
    var stream = request.Content.ReadAsStreamAsync().Result;
    var xml = XElement.Load(stream);

    var order = Deserialize<Order>(xml);
    // ...

    return Request.CreateResponse(HttpStatusCode.OK);
}

这里使用了HttpRequestMessage,它表示一个HTTP请求的消息内容,通过Content属性可以访问HTTP请求的Body。

ReadAsStreamAsync()会异步读取Body,并返回一个Stream对象。XElement.Load()将Stream转换为XElement对象,Deserialize<T>(XElement)可以将XElement转换为对象。

示例:

<?xml version="1.0" encoding="UTF-8"?>
<Order>
   <Id>1234567</Id>
   <Amount>99.9</Amount>
   <Item>test123</Item>
</Order>
public class Order
{
    public int Id {get;set;}
    public decimal Amount {get;set;}
    public string Item {get;set;}
}
var stream = new MemoryStream(Encoding.UTF8.GetBytes(xml));
var order = Deserialize<Order>(XElement.Load(stream));

2. 使用ModelBinder

通过模型绑定来自动将请求的XML转换成对应的实体类:

public HttpResponseMessage Post([ModelBinder(typeof(XmlModelBinder))] Order order)
{
    // ...

    return Request.CreateResponse(HttpStatusCode.OK);
}

在这个例子中,我们使用了一个自定义的XmlModelBinderXmlModelBinder继承自IModelBinder接口,用于将XML格式的数据绑定到对应的实体类。 在Order类上声明[XmlRoot("Order")]特性以便绑定器准确解析XML内容。

示例:

<?xml version="1.0" encoding="UTF-8"?>
<Order>
   <Id>1234567</Id>
   <Amount>99.9</Amount>
   <Item>test123</Item>
</Order>
[XmlRoot("Order")]
public class Order
{
    public int Id {get;set;}

    public decimal Amount {get;set;}

    public string Item {get;set;}
}
public class XmlModelBinder : IModelBinder
{
    public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
    {
        if (bindingContext.ModelType == typeof(Order))
        {
            try
            {
                var stream = actionContext.Request.Content.ReadAsStreamAsync().Result;
                var xml = XElement.Load(stream);
                var serializer = new XmlSerializer(typeof(Order));
                bindingContext.Model = serializer.Deserialize(xml.CreateReader());
                return true;
            }
            catch
            {
                return false;
            }
        }

        return false;
    }
}

3. 自定义MediaTypeFormatter

通过自定义MediaTypeFormatter来处理特定类型的数据。

public class XmlMediaTypeFormatter : MediaTypeFormatter
{
    public XmlMediaTypeFormatter()
    {
        SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/xml"));
    }

    public override bool CanReadType(Type type)
    {
        if (type == null)
        {
            throw new ArgumentNullException("type");
        }

        return typeof(IList).IsAssignableFrom(type) ||
            typeof(ICollection).IsAssignableFrom(type) ||
            typeof(IEnumerable).IsAssignableFrom(type) ||
            typeof(object).IsAssignableFrom(type);
    }

    public override bool CanWriteType(Type type)
    {
        if (type == null)
        {
            throw new ArgumentNullException("type");
        }

        return typeof(IList).IsAssignableFrom(type) ||
            typeof(ICollection).IsAssignableFrom(type) ||
            typeof(IEnumerable).IsAssignableFrom(type) ||
            typeof(object).IsAssignableFrom(type);
    }

    public override async Task<object> ReadFromStreamAsync(Type type, Stream readStream, HttpContent content, IFormatterLogger formatterLogger)
    {
        var encoding = content.Headers.ContentEncoding.FirstOrDefault();
        var streamReader = new StreamReader(readStream, encoding ?? Encoding.UTF8);

        var xmlSerializer = new XmlSerializer(type);
        return xmlSerializer.Deserialize(streamReader);
    }

    public override async Task WriteToStreamAsync(Type type, object value, Stream writeStream, HttpContent content, TransportContext transportContext)
    {
        using (var writer = new XmlTextWriter(writeStream, Encoding.UTF8) { Formatting = Formatting.Indented })
        {
            var xmlSerializer = new XmlSerializer(type);
            xmlSerializer.Serialize(writer, value);
            await writeStream.FlushAsync();
        }
    }
}

XmlMediaTypeFormatter添加到WebAPI格式化管理中。

config.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
config.Formatters.XmlFormatter.MediaTypeMappings.Add(new UriPathExtensionMapping("xml", "application/xml"));
config.Formatters.Insert(0, new XmlMediaTypeFormatter());

在上面的代码中,我们自定义了一个新的MediaTypeFormatter,该格式可以处理application/xml类型的数据。因此,我们需要将默认的格式从WebAPI管理器中移除,并且将我们新定义的格式添加到WebAPI管理器的开头。

示例:

<?xml version="1.0" encoding="UTF-8"?>
<Orders>
   <Order>
      <Id>1234567</Id>
      <Amount>99.9</Amount>
      <Item>test123</Item>
   </Order>
   <Order>
      <Id>7654321</Id>
      <Amount>129.9</Amount>
      <Item>test456</Item>
   </Order>
</Orders>
[XmlRoot("Orders")]
public class Orders
{
    [XmlElement("Order")]
    public List<Order> OrderList {get;set;}
}
var orders = Deserialize<Orders>(xml);

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:.net webapi接收xml格式数据的3种情况小结 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • Atitit 云计算体系树.docx Atitit 云计算之道 attilax著 艾龙 著 serverless bomb 1. 什么才是云计算的根本特征.. 2 2. 云计算体系 2 3. “云

    Atitit 云计算体系树.docx Atitit 云计算之道 attilax著 艾龙 著  serverless bomb   1. 什么才是云计算的根本特征.. 2 2. 云计算体系 2 3. “云”技术 147 3 3.1. 5.1.3 虚拟化与容器技术 160 5.1.4 远程桌面 1715.1.5 负载均衡 175 3 3.2. 5.1.11 SO…

    云计算 2023年4月10日
    00
  • IBM智慧的云计算——白皮书、行业解决方案资料集

    IBM智慧的云计算——白皮书、行业解决方案资料集 IBM云计算:智慧企业云 桌面云 IBM 智慧企业桌面云,通过更加成本有效的方法对传统的桌面计算机环境进行虚拟化。 IBM智慧企业桌面云 存储云 IBM 智慧企业测试云,利用基于云的虚拟化资源创建经济有效、稳定健壮的测试环境。 IBM智慧企业存储云 测试云 IBM 智慧企业存储云,通过可扩展的存储虚拟化解决方…

    云计算 2023年4月10日
    00
  • Python数据库编程之pymysql详解

    Python数据库编程之pymysql详解 什么是pymysql pymysql是Python语言上的一个Mysql数据库接口,它遵循Python数据库API v2.0规范,使用方式与Python内置的sqlite3、PostgreSQL数据库上的psycopg2等类似。pymysql具有易用性、模块化、线程安全和SQL注入安全等优点,在使用Python进行…

    云计算 2023年5月18日
    00
  • 云计算第五章

    Cloud-Enabling Technology云使能技术 Broadband Networks and Internet Architecture 宽带和Internet架构 -All clouds must be connected to a network(Internet or LAN) The potential of cloud platfor…

    云计算 2023年4月11日
    00
  • Python数据分析中Groupby用法之通过字典或Series进行分组的实例

    下面详细讲解一下“Python数据分析中Groupby用法之通过字典或Series进行分组的实例”的完整攻略。 1. Groupby概述 groupby是pandas中非常实用的一个功能,它可以在数据处理中进行分组聚合操作,可以对数据集进行分组,之后进行个性化的操作。在实际的数据处理中,我们经常需要对数据进行分组,比如在股票数据中,我们需要对相同股票代码的所…

    云计算 2023年5月18日
    00
  • 银行业云计算发展论坛圆满落幕

    3月21-22日,由中国信息通信研究院主办的”OSCAR云计算开源产业大会”在国家会议中心隆重召开。银行业云计算发展论坛作为大会分论坛之一,于22日下午举行。 云计算的战略地位和广阔前景吸引着互联网企业、IT企业、电信运营商、创业企业加快战略布局,企业上云已是必然之势。作为上云大军中的一员,银行上云的意识已觉醒,并开始成为业界共识。当大型银行上云的路径已清晰…

    云计算 2023年4月13日
    00
  • 云计算之后,雾计算开始

    吴韧认为,从这个意义讲, 也许所谓的“雾计算”(fog computing),是一个更加贴切的表述,意指由身边设备完成计算。他强调称,,云和雾是相辅相成, 云端无所不能,雾则无处不在,两者间的信息交换不是原始数据而是智能。 把任何数据都放入云端进行处理,需要非常大的带宽和存储支持和非常小的延时,很多情况下并非最优选择,甚至根本就无法做到。     雾计算(F…

    云计算 2023年4月10日
    00
  • 云计算里AWS和Azure的探究(2) – HackerVirus

    云计算里AWS和Azure的探究(2) 云计算里AWS和Azure的探究(2) ——Amazon EC2 和 Windows Azure Virtual Machine   Amazon EC2是Elastic Compute Cloud的简称,翻译成中文就是弹性计算云。它是Amazon云里面最基础的内容,也是发展到今天最成熟的部分,通过EC2, 你可以在A…

    云计算 2023年4月11日
    00
合作推广
合作推广
分享本页
返回顶部