一、媒体类型

  媒体类型(也称为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中给领域模型添加媒体类型支持的更多相关文章

  1. Web API中的返回值类型

    WebApi中的返回值类型大致可分为四种: Void/ IHttpActionResult/ HttpResponseMessage /自定义类型 一.Void void申明方法没有返回值,执行成功后 ...

  2. Entity Framework 6 Recipes 2nd Edition(9-3)译->找出Web API中发生了什么变化

    9-3. 找出Web API中发生了什么变化 问题 想通过基于REST的Web API服务对数据库进行插入,删除和修改对象图,而不必为每个实体类编写单独的更新方法. 此外, 用EF6的Code Fri ...

  3. 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【五】——在Web Api中实现Http方法(Put,Post,Delete)

    系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 在Web Api中,我们对资源的CRUD操作都是通过相应的Http方法来实现——Post(新 ...

  4. 【ASP.NET Web API教程】6.2 ASP.NET Web API中的JSON和XML序列化

    谨以此文感谢关注此系列文章的园友!前段时间本以为此系列文章已没多少人关注,而不打算继续下去了.因为文章贴出来之后,看的人似乎不多,也很少有人对这些文章发表评论,而且几乎无人给予“推荐”.但前几天有人询 ...

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

  6. 【ASP.NET Web API教程】6.1 媒体格式化器

    http://www.cnblogs.com/r01cn/archive/2013/05/17/3083400.html 6.1 Media Formatters6.1 媒体格式化器 本文引自:htt ...

  7. Web Api中实现Http方法(Put,Post,Delete)

    在Web Api中实现Http方法(Put,Post,Delete) 系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 在Web Api中,我 ...

  8. ASP.NET Web API中的JSON和XML序列化

    ASP.NET Web API中的JSON和XML序列化 前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok ...

  9. Web API中的内容协商

    一.内容协商的概念 HTTP规范将内容协商定义为“当有多个格式可用时为给定响应选择最佳格式的过程”.HTTP中内容协商的主要机制是这些请求标头: Accept:响应可接受哪些媒体类型,例如“appli ...

随机推荐

  1. 为什么Elasticsearch查询变得这么慢了?

    参考内容:https://mp.weixin.qq.com/s/RTpBaFpNELQCO6VE0KMfsw

  2. 大学jsp实验七--JavaBean在JSP中的应用

    值bean的应用 (1)若有如下图所示的两个JSP页面,在第一个的页面的表单中填写相应内容,提交后再显示用户的提交信息.使用JavaBean的方式实现上述效果,请写出相应的代码. bean文件:Tes ...

  3. Android 程序优化总结

    第一部分 编程规范 1.1 基本要求: 程序结构清晰,简单易懂,单个函数的程序行数不得超过100行. 打算干什么,要简单,直接. 尽量使用标准库函数和公共函数 不要随意定义全局变量,尽量使用局部变量. ...

  4. 【CF1097E】Egor and an RPG game(动态规划,贪心)

    [CF1097E]Egor and an RPG game(动态规划,贪心) 题面 洛谷 CodeForces 给定一个长度为\(n\)的排列\(a\),定义\(f(n)\)为将一个任意一个长度为\( ...

  5. 洛谷 P1129 [ZJOI2007]矩阵游戏 解题报告

    P1129 [ZJOI2007]矩阵游戏 题目描述 小\(Q\)是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏――矩阵游戏.矩阵游戏在一个\(N*N\)黑白方阵进行(如同国际象棋一般 ...

  6. luogu3811 乘法逆元

    逆元定义:若a*x=1(mod p),(a,p互质),则x为a mod p意义下的逆元 做法见https://www.luogu.org/blog/zjp-shadow/cheng-fa-ni-yua ...

  7. Permissions 0755 for '/home/lonecloud/.ssh/id_rsa' are too open.

    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: UNPROTECTED PRIVATE KEY FILE! ...

  8. JetBrains全家桶破解思路(最新更新:2019-04-17)

    JetBrains全家桶破解思路(以DataGrip为例) 2019-04-17 add new key 2019-01-24 add new key and code 2018-12-24 add ...

  9. MongoDB常用操作命令

    查看所有数据库: > show dbs; 选定数据库: > use ECommerce; 查看当前数据库状态: > db.stats(); 查看当前数据库中所有集合: > sh ...

  10. nio 阻塞 非阻塞 同步 异步

    https://mp.weixin.qq.com/s/5SKgdkC0kaHN495psLd3Tg 说在前面 上篇NIO相关基础篇二,主要介绍了文件锁.以及比较关键的Selector,本篇继续NIO相 ...