ApiController already provides the ability to handle content negotiation out of the box, but you could create your own generic method(s) that you can call from inherited controllers if you really want to customize the content negotiation process.
Your BaseAPIController
public abstract class BaseAPIController : ApiController {
protected virtual HttpResponseMessage NegotiatedContent<T>(HttpStatusCode statusCode, T content) {
var type = typeof(T);
var request = this.Request;
var formatters = this.Configuration.Formatters;
var negotiator = this.Configuration.Services.GetContentNegotiator();
var result = negotiator.Negotiate(type, request, formatters );
if (result == null) {
var response = new HttpResponseMessage(HttpStatusCode.NotAcceptable);
throw new HttpResponseException(response));
}
return new HttpResponseMessage() {
StatusCode = statusCode,
Content = new ObjectContent<T>(
content, // What we are serializing
result.Formatter, // The media formatter
result.MediaType.MediaType // The MIME type
)
};
}
}
This code is equivalent to the what ApiController provides automatically.
A potential OfficeDetailsController with a much thinner action method
public class OfficeDetailsController : BaseAPIController {
public HttpResponseMessage GetOfficeDetails(int id) {
var item = new OfficeDetailsDto() { Id = id, Name = "Gizmo"};
// what ever else needs to be done to the item
// ...
return NegotiatedContent(HttpStatusCode.Ok, item);
}
}
Here is an example of doing the same thing using ApiController defaults.
public class OfficeDetailsController : ApiController {
public IHttpActionResult GetOfficeDetails(int id) {
var item = new OfficeDetailsDto() { Id = id, Name = "Gizmo"};
// what ever else needs to be done to the item
// ...
return Ok(item);
}
}