標籤:
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) != -1) { 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
WebApi2官網學習記錄---Media Formatters