Web API中给领域模型添加媒体类型支持
一、媒体类型
媒体类型(也称为MIME类型)标识一段数据的格式。在HTTP中,媒体类型描述了消息体的格式。媒体类型由两个字符串组成,一个类型和一个子类型。例如:text / html; image/ PNG ;application/ JSON
在HTTP中,Response的 Content-Type 标头指定消息主体的格式。这告诉接收者如何解析消息体的内容。
HTTP/1.1 OK
Content-Length:
Content-Type: image/png
Request中的 Accept 标头告诉服务器客户端希望从服务器获取哪些媒体类型。
Accept: text/html,application/xhtml+xml,application/xml
此标头告诉服务器客户端需要HTML,XHTML或XML。
媒体类型用于确定Web API如何序列化和反序列化HTTP消息正文。Web API内置支持XML,JSON,BSON和表单urlencoded数据,我们也可以编写 媒体格式化程序(media-type formatter ) 来支持其他媒体器。媒体格式化器的作用是:
Read CLR objects from an HTTP message body
Write CLR objects into an HTTP message body
要创建媒体格式化器,请从以下类之一派生:
MediaTypeFormatter。该类使用异步读写方法。
BufferedMediaTypeFormatter。此类派生自MediaTypeFormatter,使用同步读/写方法,简单但是会读写期间阻塞线程。
从BufferedMediaTypeFormatter派生更简单,因为没有异步代码,但它也意味着调用线程会在I / O期间阻塞。
二、一个创建媒体格式的栗子
需求:为Book模型创建CSV媒体格式化程序,用于将Book对象序列化为逗号分隔值格式的媒体类型(CSV)。以下是Book对象的定义:
public class Book
{
public int BookId { get; set; }
public string Title{ get; set; }
public string Genre { get; set; }
public decimal Price { get; set; }
}
第一步:创建一个BookCsvFormatter
BookCsvFormatter继承于BufferedMediaTypeFormater类:
public class BookCsvFormatter : BufferedMediaTypeFormatter
{
//构造函数
public BookCsvFormatter()
{
//添加支持的Mime类型
SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/csv"));
// 添加支持的编码类型
SupportedEncodings.Add(new UTF8Encoding(encoderShouldEmitUTF8Identifier: false));
SupportedEncodings.Add(Encoding.GetEncoding("iso-8859-1"));
}
//实现BufferedMediaTypeFormatter抽象方法,是否可读
public override bool CanReadType(Type type)
{
//不可读
return false;
} //实现BufferedMediaTypeFormatter抽象方法,是否可写
public override bool CanWriteType(Type type)
{
if (type == typeof(Book))
{ return true;}
else
{
//支持csv类型集合的读取
Type enumbook = typeof(IEnumerable<Book>);
return enumbook.IsAssignableFrom(type);
}
} //重写写入方法
public override void WriteToStream(Type type, object value, Stream writeStream, HttpContent content)
{
//通过httpcontent获取编码类型
Encoding currentEncoding = SelectCharacterEncoding(content.Headers);
using (var writer=new StreamWriter(writeStream, currentEncoding))
{
var books = value as IEnumerable<Book>;
if (books!=null)
{
foreach (var book in books)
{
WriteItem(book, writer);
}
}
else
{
var singleBook = value as Book;
if (singleBook == null)
{
throw new InvalidOperationException("不能序列化该类型");
}
WriteItem(singleBook, writer);
}
}
}
public void WriteItem(Book book, StreamWriter writer) {
writer.WriteLine($"{book.BookId.ToString()},{book.Title.ToString()},{book.Genre.ToString()},{book.Price.ToString()}");
}
}
第二步:将BookCsvFormatter程序添加到Web API管道
打开WebApiConfig.cs,添加以下代码
public static void ConfigureApis(HttpConfiguration config)
{
//添加这行代码
config.Formatters.Add(new BookCsvFormatter ());
}
第三步:测试
在BooksController中添加控制器如下
[Route("~/api/books/helloCsv")]
public HttpResponseMessage GetBook()
{
Book book = new Book { BookId=,Title="哈利波特",Genre="玄幻",Price=59.99M};
return Request.CreateResponse(HttpStatusCode.OK, book, "text/csv");
}
重新生成后启动在url填入http://localhost:60398/api/books/helloCsv,会直接下载一个名字为helloCsv的文件
打开记事本打开helloCsv,内容是:1,哈利波特,玄幻,59.99 ,测试成功。
本文实现了一个简单的添加媒体类型的方法,如果想了解更多请查看官网。
Web API中给领域模型添加媒体类型支持的更多相关文章
- Web API中的返回值类型
WebApi中的返回值类型大致可分为四种: Void/ IHttpActionResult/ HttpResponseMessage /自定义类型 一.Void void申明方法没有返回值,执行成功后 ...
- Entity Framework 6 Recipes 2nd Edition(9-3)译->找出Web API中发生了什么变化
9-3. 找出Web API中发生了什么变化 问题 想通过基于REST的Web API服务对数据库进行插入,删除和修改对象图,而不必为每个实体类编写单独的更新方法. 此外, 用EF6的Code Fri ...
- 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【五】——在Web Api中实现Http方法(Put,Post,Delete)
系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 在Web Api中,我们对资源的CRUD操作都是通过相应的Http方法来实现——Post(新 ...
- 【ASP.NET Web API教程】6.2 ASP.NET Web API中的JSON和XML序列化
谨以此文感谢关注此系列文章的园友!前段时间本以为此系列文章已没多少人关注,而不打算继续下去了.因为文章贴出来之后,看的人似乎不多,也很少有人对这些文章发表评论,而且几乎无人给予“推荐”.但前几天有人询 ...
- Asp.Net Web API 2第十三课——ASP.NET Web API中的JSON和XML序列化
前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html 本文描述ASP.NET W ...
- 【ASP.NET Web API教程】6.1 媒体格式化器
http://www.cnblogs.com/r01cn/archive/2013/05/17/3083400.html 6.1 Media Formatters6.1 媒体格式化器 本文引自:htt ...
- Web Api中实现Http方法(Put,Post,Delete)
在Web Api中实现Http方法(Put,Post,Delete) 系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 在Web Api中,我 ...
- ASP.NET Web API中的JSON和XML序列化
ASP.NET Web API中的JSON和XML序列化 前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok ...
- Web API中的内容协商
一.内容协商的概念 HTTP规范将内容协商定义为“当有多个格式可用时为给定响应选择最佳格式的过程”.HTTP中内容协商的主要机制是这些请求标头: Accept:响应可接受哪些媒体类型,例如“appli ...
随机推荐
- C Looooops POJ - 2115 拓展gcd 有一个定理待补()
补算法导论P564 MODULAR-LINEAR-EQUATION-SOLVER算法(P564)
- FPGA时序分析相关
什么叫时序? 时间与动作的相互关系,什么时间干什么活. 同步时序:单一时钟源,所有寄存器在单一时钟源下同步工作. 异步时序:多个时钟源,除使用带时钟的触发器之外,还可以使用不带时钟的触发器与延时元件作 ...
- 【XSY2785】模型
题目描述 给你一棵\(n\)个点的树,让你加最少的边,使得图中没有割点. 要求输出方案. \(n\leq 500000\) 题解 把叶子的权值设为\(1\),其他点设为\(0\),找出带权重心. 以重 ...
- C# 获取变量或对象的栈与堆地址
C# 获取变量或对象的栈与堆地址 来源 https://www.cnblogs.com/xiaoyaodijun/p/6605070.html using System; using System.C ...
- C# 成员默认访问权限(public、private、protected、internal)
C# 成员默认访问权限(public.private.protected.internal) 来源 https://www.cnblogs.com/yezongjie/p/20181121Access ...
- 洛谷P4689 [Ynoi2016]这是我自己的发明(莫队,树的dfn序,map,容斥原理)
洛谷题目传送门 具体思路看别的题解吧.这里只提两个可能对常数和代码长度有优化的处理方法. I 把一个询问拆成\(9\)个甚至\(16\)个莫队询问实在是有点珂怕. 发现询问的一边要么是一个区间,要么是 ...
- grafana安装使用及与zabbix集成
grafana简介Grafana是一个完全开源的度量分析与可视化平台,可对来自各种各种数据源的数据进行查询.分析.可视化处理以及配置告警. Grafana支持的数据源:官方:Graphite,Infl ...
- Redhat上为java Maven项目构建基于Jenkins + Github的持续集成环境
在Redhat enterprise 6.5 的服务器上,为在gutub 上的 java mvaen项目构建一个持续集成环境,用到了Jenkins.因公司的服务器在内网,访问外网时要通过代理,所以为m ...
- MineSite
country:http://s01.flagcounter.com/more/SoJN/
- Centos7下源码编译安装python3.6
测试环境: 操作步骤: 1. 下载Python源码包(python3.6.0) 官网下载地址:https://www.python.org/downloads/ 搜狐下载地址:http://mirro ...