1. 有什么用?
通常用来标识http请求中的内容的类型用来告诉server端如何解析client端发送的message, 或者标识client希望从server端得到的资源是什么样的类型。又被称为MIME type。
2. 怎么用?
media-type一般被放在header里面。比如一个http请求中:
HTTP/1.1 200 OK
Content-Length: 95267
Content-Type: image/png Accept: text/html,application/xhtml+xml,application/xml
server端在接收到请求后会根据请求中的type类型进行序列化&反序列化message。
3. 如何定义server端的media type format?
server端有build-in的media type比如:xml, json,bson等, 同时也可以自定义type。只需要继承MediaTypeFormatter, BufferedMediaTypeFormatter
可以通过此链接去看如何创建一个自定义的CSV media type。
4. 如何移除一种format?
void ConfigureApi(HttpConfiguration config)
{
// Remove the JSON formatter
config.Formatters.Remove(config.Formatters.JsonFormatter); // or // Remove the XML formatter
config.Formatters.Remove(config.Formatters.XmlFormatter);
}
5. 使用单元测试用例测试你定义的format是否可用?
下面的栗子可以保证你在没有相对应的action或者Controller的情况下测试你的format。code来自msdn。
string Serialize<T>(MediaTypeFormatter formatter, T value)
{
// Create a dummy HTTP Content.
Stream stream = new MemoryStream();
var content = new StreamContent(stream);
/// Serialize the object.
formatter.WriteToStreamAsync(typeof(T), value, stream, content, null).Wait();
// Read the serialized string.
stream.Position = 0;
return content.ReadAsStringAsync().Result;
} T Deserialize<T>(MediaTypeFormatter formatter, string str) where T : class
{
// Write the serialized string to a memory stream.
Stream stream = new MemoryStream();
StreamWriter writer = new StreamWriter(stream);
writer.Write(str);
writer.Flush();
stream.Position = 0;
// Deserialize to an object of type T
return formatter.ReadFromStreamAsync(typeof(T), stream, null, null).Result as T;
} // Example of use
void TestSerialization()
{
var value = new Person() { Name = "Alice", Age = 23 }; var xml = new XmlMediaTypeFormatter();
string str = Serialize(xml, value); var json = new JsonMediaTypeFormatter();
str = Serialize(json, value); // Round trip
Person person2 = Deserialize<Person>(json, str);
}