using System.Net.Http.Formatting;
public class ProductCsvFormatter : BufferedMediaTypeFormatter
public override bool CanWriteType(System.Type type)
if (type == typeof(Product))
Type enumerableType = typeof(IEnumerable<Product>);
return enumerableType.IsAssignableFrom(type);
public override bool CanReadType(Type type)
public override void WriteToStream(Type type, object value, Stream writeStream, HttpContent content)
using (var writer = new StreamWriter(writeStream))
var products = value as IEnumerable<Product>;
foreach (var product in products)
WriteItem(product, writer);
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)
string field = o.ToString();
if (field.IndexOfAny(_specialChars) != -1)
return String.Format("\"{0}\"", field.Replace("\"", "\"\""));