原文:http://www.asp.net/web-api/overview/formats-and-model-binding/media-formatters

1. 网络媒体类型

媒体类型,也叫作MIME类型,表示数据的格式。在HTTP中,MIME描述了消息体的格式。

  • MIME类型有两个字符串组成——类型和子类型。例如:
  1. text/html
  2. image/png
  3. application/json
  • 当HTTP消息包含一个数据体时,Content-Type 头部指出了数据体的格式。这告诉接收者怎么解析消息体。例如,如果HTTP响应包含一个PNG图片,那响应可能包含以下头部。
  1. HTTP/1.1 200 OK
  2. Content-Length: 95267
  3. Content-Type: image/png
  • 客户端可以包含Accept头部来发起一个请求。Accept头部告诉服务器客户端想要什么类型的MIME类型。例如:
  1. Accept: text/html,application/xhtml+xml,application/xml

这个头部告诉服务器,客户端想要HTML,XHTML,或者XML。

  • MIME类型决定了WEB API怎么序列化和反序列化HTTP的消息体。WEB API有内置的MIME,支持XML,JSON,BSON,以及form-urlencoded数据,也可以通过自定义一个媒体格式。

为了创建一个MIME格式,从以下其中一个类派生:

  • MediaTypeFormatter. 这个类使用异步的读写方法。

  • BufferedMediaTypeFormatter. 这个类从MediaTypeFormatter 派生,但是使用同步的读写方法。

2. 示例:创建一个CSV媒体格式

Steps:

  1. 创建一个ProductCsvFormatter
  2. 构造函数添加支持的媒体类型
  3. 重写CanWriteType,表明可以序列化的类型
  4. 重写CanReadType,表明可以反序列化的类型
  5. 重写WriteToStream,序列化的真正实现
  6. 将媒体格式添加到WEB API管道
  7. 添加字符编码支持,支持UTF-8,iso-8859-1
  8. 增加测试代码

ProductCsvFormatter 代码片段

  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Net.Http;
  5. using System.Net.Http.Formatting;
  6. using System.Net.Http.Headers;
  7. using System.Text;
  8. using WebApiPractice.Models;
  9. namespace WebApiPractice.Formatters
  10. {
  11. //http://www.asp.net/web-api/overview/formats-and-model-binding/media-formatters
  12. //Step1
  13. public class ProductCsvFormatter: BufferedMediaTypeFormatter
  14. {
  15. public ProductCsvFormatter()
  16. {
  17. //Step2
  18. SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/csv"));
  19. //Step7
  20. SupportedEncodings.Add(new UTF8Encoding(encoderShouldEmitUTF8Identifier: false));
  21. SupportedEncodings.Add(Encoding.GetEncoding("iso-8859-1"));
  22. }
  23. //Step3
  24. public override bool CanWriteType(Type type)
  25. {
  26. if(type == typeof(Product))
  27. {
  28. return true;
  29. }
  30. Type enumerableType = typeof(IEnumerable<Product>);
  31. return enumerableType.IsAssignableFrom(type);
  32. }
  33. //Step4
  34. public override bool CanReadType(Type type)
  35. {
  36. return false;
  37. }
  38. //Step5
  39. public override void WriteToStream(Type type, object value, Stream writeStream, HttpContent content)
  40. {
  41. //Step7
  42. Encoding effectiveEncoding = SelectCharacterEncoding(content.Headers);
  43. using (var writer = new StreamWriter(writeStream, effectiveEncoding))
  44. {
  45. var products = value as IEnumerable<Product>;
  46. if (products != null)
  47. {
  48. foreach (var product in products)
  49. {
  50. WriteItem(product, writer);
  51. }
  52. }
  53. else
  54. {
  55. var singleProduct = value as Product;
  56. if (singleProduct == null)
  57. {
  58. throw new InvalidOperationException("Cannot serialize type");
  59. }
  60. WriteItem(singleProduct, writer);
  61. }
  62. }
  63. }
  64. // Helper methods for serializing Products to CSV format.
  65. private void WriteItem(Product product, StreamWriter writer)
  66. {
  67. writer.WriteLine("{0},{1},{2},{3}", Escape(product.Id),
  68. Escape(product.Name), Escape(product.Category), Escape(product.Price));
  69. }
  70. static char[] _specialChars = new char[] { ',', '\n', '\r', '"' };
  71. private string Escape(object o)
  72. {
  73. if (o == null)
  74. {
  75. return "";
  76. }
  77. string field = o.ToString();
  78. if (field.IndexOfAny(_specialChars) != -1)
  79. {
  80. // Delimit the entire field with quotes and replace embedded quotes with "".
  81. return String.Format("\"{0}\"", field.Replace("\"", "\"\""));
  82. }
  83. else return field;
  84. }
  85. }
  86. }

WebApiConfig代码片段

  1. using System.Web.Http;
  2. using Microsoft.Owin.Security.OAuth;
  3. using WebApiPractice.Formatters;
  4. namespace WebApiPractice
  5. {
  6. public static class WebApiConfig
  7. {
  8. public static void Register(HttpConfiguration config)
  9. {
  10. // Web API 配置和服务
  11. // 将 Web API 配置为仅使用不记名令牌身份验证。
  12. config.SuppressDefaultHostAuthentication();
  13. config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
  14. // Web API 路由
  15. config.MapHttpAttributeRoutes();
  16. config.Routes.MapHttpRoute(
  17. name: "DefaultApi",
  18. routeTemplate: "api/{controller}/{id}",
  19. defaults: new { id = RouteParameter.Optional }
  20. );
  21. //Step6,加入web api管道
  22. config.Formatters.Add(new ProductCsvFormatter());
  23. }
  24. }
  25. }

测试代码

  1. using System;
  2. using System.Net.Http;
  3. using System.Net.Http.Headers;
  4. namespace WebApiPractice
  5. {
  6. public class WebApiRequestHelper
  7. {
  8. public void Start()
  9. {
  10. HttpClient httpClient = new HttpClient();
  11. httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/csv", 1));
  12. var t = httpClient.GetStringAsync("http://localhost:60865/api/products");
  13. t.Wait();
  14. System.Diagnostics.Debug.WriteLine(t.Result);
  15. Console.WriteLine(t.Result);
  16. }
  17. }
  18. }

测试结果

  1. 1,Tomato Soup,Groceries,1
  2. 2,Yo-yo,Toys,3.75
  3. 3,Hammer,Hardware,16.99

Media Formatters in ASP.NET Web API 2的更多相关文章

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

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

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

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

  3. 【ASP.NET Web API教程】6 格式化与模型绑定

    原文:[ASP.NET Web API教程]6 格式化与模型绑定 6 Formats and Model Binding 6 格式化与模型绑定 本文引自:http://www.asp.net/web- ...

  4. Asp.Net Web API 2第十二课——Media Formatters媒体格式化器

    前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html 本教程演示如何在ASP.N ...

  5. ASP.NET Web API 2.1支持Binary JSON(Bson)

    ASP.NET Web API 2.1内建支持XML.Json.Bson.form-urlencoded的MiME type,今天重点介绍下Bson.BSON是由10gen开发的一个数据格式,目前主要 ...

  6. ASP.NET Web API系列教程目录

    ASP.NET Web API系列教程目录 Introduction:What's This New Web API?引子:新的Web API是什么? Chapter 1: Getting Start ...

  7. 【ASP.NET Web API教程】6.3 内容协商

    本文是Web API系列教程的第6.3小节 6.3 Content Negotiation 6.3 内容协商 摘自:http://www.asp.net/web-api/overview/format ...

  8. Asp.Net Web API 2第十四课——Content Negotiation(内容协商)

    前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html 本文描述ASP.NET W ...

  9. Replace JSON.NET with ServiceStack.Text in ASP.NET Web API

    Because ServiceStack.Text performs much better I recently stumbled across a comparison of JSON seria ...

随机推荐

  1. Maven:将Jar安装到本地仓库和Jar上传到私服

    1.依赖如下: <dependency> <groupId>org.quartz-scheduler.internal</groupId> <artifact ...

  2. 11月6日上午PHP练习《租房子》解析

    一.题目要求 二.题目做法 1.建立数据库 2.封装类文件 <?php class DBDA { public $fuwuqi="localhost"; //服务器地址 pu ...

  3. thinkphp上传

    上传代码 // 缩略图上传 $upload = new \Think\Upload();// 实例化上传类 $upload->maxSize = ;// 设置附件上传大小 $upload-> ...

  4. CSS3 时钟

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. sqilite学习

    1,用代码插入数据 for (int i = 0; i < 100; i++) {        NSString *nameStr = [NSString stringWithFormat:@ ...

  6. 与或左移右移操作在ARM寄存器配置中的作用

    逻辑运算: 与运算&:与0清零  清零用与运算 或运算 |:或1置一  置一用或运算 异或 ^:不同为1  /*****单个寄存器清零置一*************************** ...

  7. PHP图像裁剪为任意大小的图像,图像不变形,不留下空白

    <?php /** * 说明:函数功能是把一个图像裁剪为任意大小的图像,图像不变形 * 参数说明:输入 需要处理图片的 文件名,生成新图片的保存文件名,生成新图片的宽,生成新图片的高 */ fu ...

  8. Eclipse启动tomcat,http://localhost:8080/无法访问的解决方法

    双击eclipse的Server打开配置页面,将server locations的选项改成第二项,然后把Destroy Path改成webapps,然后就可以了.如果是灰色的,没法进行修改,那么就要先 ...

  9. Linux串口中的超时设置

    在Linux下使用串口通信时,默认的阻塞模式是不实用的.而采用select或epoll机制的非阻塞模式,写代码有比较麻烦.幸好Linux的串口自己就带有超时机制. Linux下使用termios.h中 ...

  10. BestCoder Round #90

    有生以来第一场在COGS以外的地方打的比赛.挂成dog了. 主要是没有经验,加之代码能力过弱.还有最后的瞎hack三次,Too Young Too Simple...... 言归正传. (抄一发题解先 ...