Skip to main content

Custom Negotiate

  • Custom Negotiate

To implement custom content negotiation in ASP.NET Web API, you can create a custom IContentNegotiator and override the Negotiate method. This will allow you to inspect the request headers and select the appropriate media type formatter and version for the response.

public class CustomContentNegotiator : IContentNegotiator
{
private readonly IContentNegotiator _defaultNegotiator = new DefaultContentNegotiator();

public ContentNegotiationResult Negotiate(Type type, HttpRequestMessage request, IEnumerable<MediaTypeFormatter> formatters)
{
var apiVersion = GetApiVersionFromRequestHeader(request);

if (!string.IsNullOrEmpty(apiVersion))
{
var matchedFormatters = formatters
.Where(formatter => formatter.SupportedMediaTypes
.Any(mediaType => mediaType.Parameters
.Any(parameter => parameter.Value.Equals(apiVersion, StringComparison.OrdinalIgnoreCase))))
.ToList();

if (matchedFormatters.Count > 0)
{
return _defaultNegotiator.Negotiate(type, request, matchedFormatters);
}
}

return _defaultNegotiator.Negotiate(type, request, formatters);
}

private string GetApiVersionFromRequestHeader(HttpRequestMessage request)
{
// Assuming the custom header is named "X-Api-Version"
const string headerName = "X-Api-Version";
string apiVersion = null;

if (request.Headers.Contains(headerName))
{
apiVersion = request.Headers.GetValues(headerName).FirstOrDefault();
}

return apiVersion;
}
}

/* 2 passo*/

public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Other configuration code...

config.Services.Replace(typeof(IContentNegotiator), new CustomContentNegotiator());
}
}

/* 3 passo */

public class V1JsonMediaTypeFormatter : JsonMediaTypeFormatter
{
public V1JsonMediaTypeFormatter()
{
SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/json")
{
Parameters = { new NameValueHeaderValue("version", "1.0") }
});
}
}

public class V2JsonMediaTypeFormatter : JsonMediaTypeFormatter
{
public V2JsonMediaTypeFormatter()
{
SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/json")
{
Parameters = { new NameValueHeaderValue("version", "2.0") }
});
}
}

/*4 passo */
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Other configuration code...

config.Formatters.Add(new V1JsonMediaTypeFormatter());
config.Formatters.Add(new V2JsonMediaTypeFormatter());
}
}