asp.net-web-api

ASP.NET Web API MediaTypeFormatter

MediaTypeFormatter Basic Information

MediaTypeFormatter is an abstract class from which JsonMediaTypeFormatter and XmlMediaTypeFormatter classes inherit from. Here, JsonMediaTypeFormatter class handles JSON objects and XmlMediaTypeFormatter class handles XML objects.

Return only JSON irrespective of the Accept Header value:

To return only JSON objects in the response of the request weather Accept Header value of request if application/json or application/xml write the following line in the Register method of WebApiConfig class.

config.Formatters.Remove(config.Formatters.XmlFormatter);

Here, config is a object of HttpConfiguration class. This line of code completely removes XmlFormatter which forces ASP.NET Web API to always return JSON irrespective of the Accept header value in the client request. Use this technique when you want your service to support only JSON and not XML.

Return only XML irrespective of the Accept Header value:

To return only XML objects in the response of the request weather Accept Header value of request if application/json or application/xml write the following line in the Register method of WebApiConfig class.

config.Formatters.Remove(config.Formatters.JsonFormatter);

Here, config is a object of HttpConfiguration class as described above. This line of code completely removes JsonFormatter which forces ASP.NET Web API to always return XML irrespective of the Accept header value in the client request. Use this technique when you want your service to support only XML and not JSON.

Return JSON instead of XML:

  1. When a request is issued from the browser, the web API service should return JSON instead of XML.
  2. When a request is issued from a tool like fiddler the Accept header value should be respected. This means if the Accept header is set to application/xml the service should return XML and if it is set to application/json the service should return JSON.

Method 1:

Include the following line in Register method of WebApiConfig class.

config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));

This instruct ASP.NET Web API to use JsonFormatter when request is made for text/html which is the default for most browsers. The problem with this approach is that Content-Type header of the response is set to text/html which is misleading.

Method 2:

Use Custom formatters. Make a class which is derived from JsonMediaTypeFormatter class and implement SetDefaultContentHeaders method.

Here is the example of custom JSON formatter class which returns JSON format in response.

public class CustomJsonFormatter : JsonMediaTypeFormatter
{
    public CustomJsonFormatter()
    {
        this.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
    }

    public override void SetDefaultContentHeaders(Type type, HttpContentHeaders headers, MediaTypeHeaderValue mediaType)
    {
        base.SetDefaultContentHeaders(type, headers, mediaType);
        headers.ContentType = new MediaTypeHeaderValue("application/json");
    }
}

And this is the example of Custom Media type formatter which returns CSV format in response.

public class CSVMediaTypeFormatter : MediaTypeFormatter {

    public CSVMediaTypeFormatter()
    {
        SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/csv"));
    }
    
    public CSVMediaTypeFormatter(MediaTypeMapping mediaTypeMapping) : this()
    {
        MediaTypeMappings.Add(mediaTypeMapping);
    }
    
    public CSVMediaTypeFormatter(IEnumerable<MediaTypeMapping> mediaTypeMappings) : this()
    {
        foreach (var mediaTypeMapping in mediaTypeMappings)
        {
            MediaTypeMappings.Add(mediaTypeMapping);
        }
    }
}

After, implementing the custom formatter class register it in Register method of WebApiConfig class.

config.Formatters.Add(new CustomJsonFormatter());

Now, according to your formatter you will get response and Content-Type from the server.


This modified text is an extract of the original Stack Overflow Documentation created by the contributors and released under CC BY-SA 3.0 This website is not affiliated with Stack Overflow