.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日

相关文章

  • vue歌曲进度条示例代码

    简介 Vue.js是一款流行的JavaScript框架,可以用于构建现代化的Web应用程序。在Vue.js中,可以使用组件来构建复杂的用户界面。本文将详细讲解如何使用Vue.js构建一个歌曲进度条组件。 歌曲进度条组件 歌曲进度条组件是一个常见的UI组件,用于显示歌曲的播放进度。在Vue.js中,可以使用组件来构建歌曲进度条。以下是歌曲进度条组件的示例代码:…

    云计算 2023年5月16日
    00
  • 云环境自动化(Terraform+Ansible)

    应用的自动化部署由来已久,也有很多知名的工具,比如puppet,ansible,saltstack,chef等等。但是对于基础设施部分,一般都是以事先准备的方式来提供的。 虽然各大云服务器厂商也逐步提供了各类的API,用来控制自己的基础设施,但是,由于各类厂商的差异性,API差异很大且没有统一分类标准,兼容各个云环境的难度非常大。 不过,随着Terrafor…

    云计算 2023年4月18日
    00
  • 批量计算简介与使用-影视动漫阿里云BCS实践系列一

    批量计算: 批量计算(BatchCompute)是一种适用于大规模并行批处理作业的分布式云服务。BatchCompute 可支持海量作业并发规模,系统自动完成资源管理、作业调度和数据加载,并按实际使用量计费。 通俗的讲,就是您可以提交一个任意的计算机程序,让它在阿里云的多个 VM 实例上同时运行,然后把结果写入到指定的持久化存储位置(如阿里云对象存储 OSS…

    云计算 2023年4月12日
    00
  • C#调用新浪微博API实例代码

    首先需要明确的是,要调用新浪微博API,需要先获取到新浪微博开放平台的App Key、App Secret以及授权后获得的Access Token。有了这些准备工作后,就可以使用C#语言来调用API了。 以下是C#调用新浪微博API的完整攻略: 步骤1:引入依赖库 在使用C#调用新浪微博API时,需要引入两个依赖库: RestSharp库:用于向API服务器…

    云计算 2023年5月17日
    00
  • 《云计算:原理与范式》一第2章 迁移到云2.1 引言

    第2章 迁移到云 T. S. MOHAN 2.1 引言 云计算的承诺使得中小型企业对IT有着无可估量的期望,大公司对其争论不休。云计算是IT的一种突破性模式,其创新在于部分技术和部分商业模式,简言之,就是IT的“突破性技术商业化模式”。这一导引章节主要关注一些决策者、架构师和系统管理人员在应对他们的IT需求、试图理解和利用云计算时所面对的关键问题和相关的困境…

    云计算 2023年4月13日
    00
  • 详解目标检测模型的评价指标及代码实现

    摘要:为了评价模型的泛化能力,即判断模型的好坏,我们需要用某个指标来衡量,有了评价指标,就可以对比不同模型的优劣,并通过这个指标来进一步调参优化模型。 本文分享自华为云社区《目标检测模型的评价指标详解及代码实现》,作者:嵌入式视觉。 前言 为了了解模型的泛化能力,即判断模型的好坏,我们需要用某个指标来衡量,有了评价指标,就可以对比不同模型的优劣,并通过这个指…

    云计算 2023年4月17日
    00
  • 如何保护企业业务的关键数据?企业预防数据灾难的12种方法

    如何保护企业业务的关键数据? 企业业务的关键数据是企业运营的重要资产,需要采取措施来保护。以下是保护企业业务关键数据的一些方法: 数据备份:定期备份数据,确保数据不会因为硬件故障、人为错误或自然灾害等原因丢失。 数据加密:对敏感数据进行加密,确保数据在传输和存储过程中不会被窃取或篡改。 访问控制:限制对关键数据的访问权限,确保只有授权人员可以访问和修改数据。…

    云计算 2023年5月16日
    00
  • KubeSphere Meetup 北京站火热报名中 | 搭载 CIC 2021 云计算峰会

    “CIC 2021 云计算峰会”是一场 Top 级行业盛会,将汇聚 800 家青云QingCloud 企业客户信息化负责人,采取线上线下相结合的方式,与会规模将超过 10000 人。 大会的主题为“预见·数字自由”,将有技术大牛分享前沿成果,行业大咖带来实战经验。本次大会除了主论坛,还设置了多个分论坛。KubeSphere Meetup 将作为其中一个分论坛…

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