WebApi2官网学习记录---Media Formatters
Web API内建支持XML、JSON、BSON、和form-urlencoded的MiME type。
创建的自定义MIME类型要继承一下类中的一个:
- MediaTypeFormatter 这个类使用异步的读/写方法
- BufferedMediaTypeFormatter 这个类继承自MediaTypeFormatter,但它使用同步的读/写方法
自定义一个MIME类型,如下:
public class ProductCsvFormatter:BufferedMediaTypeFormatter
{
public ProductCsvFormatter()
{
//媒体类型
SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/csv"));
//支持的字符集
SupportedEncodings.Add(Encoding.GetEncoding("iso-8859-1"));
SupportedEncodings.Add(new UTF8Encoding(encoderShouldEmitUTF8Identifier:false)); }
//指示哪种类型 格式化器可以进行序列化,
public override bool CanWriteType(Type type)
{//支持序列化翻个Product对象和Product对象集合
if (type == typeof(Product))
return true;
else
{
Type enumerableType = typeof(IEnumerable<Product>);
return enumerableType.IsAssignableFrom(type);
}
}
//指示哪个对象可以被反序列化
public override bool CanReadType(Type type)
{//目前不需要反序列化 所以返回false
return false;
}
//序列化对象并写入流,如果支持反序列化还需要重载ReadFromStream方法
public override void WriteToStream(Type type, object value, System.IO.Stream writeStream, System.Net.Http.HttpContent content)
{
Encoding effectiveEncoding = SelectCharacterEncoding(content.Headers);
using (var writer = new StreamWriter(writeStream, effectiveEncoding))
{
var products = value as IEnumerable<Product>;
if (products != null)
{
foreach (var product in products)
{
WriteItem(product, writer);
}
}
else
{
var singleProduct = value as Product;
if (singleProduct == null)
throw new InvalidOperationException("Cannot serialize type");
WriteItem(singleProduct, writer);
}
}
}
private void WriteItem(Product product, StreamWriter writer)
{
writer.WriteLine("{0},{1},{2},{3}", Escape(product.Id),
Escape(product.Name), Escape(product.Category), Escape(product.Price));
} static char[] _specialChars = new char[] { ',', '\n', '\r', '"' };
private string Escape(object o)
{
if (o == null)
return "";
string field = o.ToString();
if (field.IndexOfAny(_specialChars) != -)
{
return String.Format("\"{0}\"", field.Replace("\"", "\"\""));
}
else
return field; }
}
public static void Register(HttpConfiguration config)
{
// Web API 配置和服务 // Web API 路由
config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
//添加自定义的MIME类型
config.Formatters.Add(new ProductCsvFormatter());
}
模拟请求如图:请求时要指定Content-Type
或者在控制台模拟一个请求:
static void Main(string[] args)
{
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/csv"));
string result = client.GetStringAsync("http://localhost:53330/api/products/").Result;
System.IO.File.WriteAllText("d:\\products.csv", result);
}
WebApi2官网学习记录---Media Formatters的更多相关文章
- WebApi2官网学习记录---Content Negotiation
Content Negotiation的意思是:当有多种Content-Type可供选择时,选择最合适的一种进行序列化并返回给client. 主要依据请求中的Accept.Accept-Charset ...
- WebApi2官网学习记录---BSON
BSON 是轻量级的,能够进行快速查询和高效的解码/编码.BSON方便查询是由于elements的前面都有一个表示长度的字段,所以解释器可以快速跳过这个elements:高效的解码/编码是因为nume ...
- WebApi2官网学习记录---Configuring
Configuration Settings WebAPI中的configuration settings定义在HttpConfiguration中.有一下成员: DependencyResolver ...
- WebApi2官网学习记录---JSON与XML的序列化
JSON序列化: WebAPI的默认序列库使用的是Json.NET,可以在Globally中配置使用DataContractJsonSerializer 进行序列化 protected void Ap ...
- WebApi2官网学习记录---Cookie
Cookie的几个参数: Domain.Path.Expires.Max-Age 如果Expires与Max-Age都存在,Max-Age优先级高,如果都没有设置cookie会在会话结束后删除cook ...
- WebApi2官网学习记录---批量处理HTTP Message
原文:Batching Handler for ASP.NET Web API 自定义实现HttpMessageHandler public class BatchHandler : HttpMess ...
- WebApi2官网学习记录---Html Form Data
HTML Forms概述 <form action="api/values" method="post"> 默认的method是GET,如果使用GE ...
- WebApi2官网学习记录--HttpClient Message Handlers
在客户端,HttpClient使用message handle处理request.默认的handler是HttpClientHandler,用来发送请求和获取response从服务端.可以在clien ...
- WebApi2官网学习记录--HTTP Message Handlers
Message Handlers是一个接收HTTP Request返回HTTP Response的类,继承自HttpMessageHandler 通常,一些列的message handler被链接到一 ...
随机推荐
- ORACLE基本SQL语句-添加更新数据函数篇
一.添加数据 /*添加数据*/insert into STU values('stu0004','赵一',18,1,"kc0004");insert into STU(STU_ID ...
- jQuery操作元素
通常,我们在创建元素时,会使用以下代码: var p = document.createElement("p"); p.innerText = "this is para ...
- (五)backbone - DEMO - 通信录改造之使用requirejs
DEMO介绍是 DEMO通信录的扩展,使用requirejs模块化整合 大体实现 • model文件 model/contact.js define(function (){ // user cont ...
- 安全性良好的operator=操作,和新的new方法(针对深度复制的情况)
class B { }; class A { public: A& operator=(const A& a) { B* temp = b; //这里解决重复赋值的方法是用temp指向 ...
- 概率dp小结
好久之前学过,记得是一次亚洲区的前几天看了看概率dp,然后亚洲区就出了一道概率dp,当时虽然做上了,但是感觉有很多地方没懂,今天起早温习了一下,觉得很多地方茅塞顿开,果然学习的话早上效果最好了. 首先 ...
- 将含有父ID的列表转成树
我们知道数据库一般是以一个列表(id,pid)的形式保存树的.如何提取这棵树呢?最简单的方法就是根据pid循环查表.但是毫无疑问,这会产生巨大的数据库查询开销. 那么一般建议的方法是一次性将全部相关数 ...
- Ubuntu12.04下载Android4.0.1源码全过程,附若干问题解决[转]
学校里一直在做应用层开发,考虑到日后就业问题,这次决定研究源码和驱动,并进行编译.没想到就下载源码这一步折腾了我整整两天,期间遇到很多问题,哎,记录于此,希望日后再下源码的人不要再走无谓的弯路了.事实 ...
- 网站卡死,照惯例运行.bat批量处理文件进行重启不起作用
网站卡死,照惯例运行.bat批量处理文件进行重启不起作用,进入虚拟机控制台进行虚拟机重启仍然不起作用,通过ping分析物理服务器能ping通,各个虚拟机之前也能ping通,但是不能ping通外部,分析 ...
- Codeforces 545C Woodcutters
http://codeforces.com/contest/545/problem/C 题目大意: 给n棵树的在一维数轴上的坐标,以及它们的高度.现在要你砍倒这些树,树可以向左倒也可以向右倒,砍倒的树 ...
- zoj2314 经典 无源汇有上下界最大流 并输出可行流
ZOJ Problem Set - 2314 Reactor Cooling Time Limit: 5 Seconds Memory Limit: 32768 KB Specia ...