Action Results in Web API 2 - ablealias/MVC GitHub Wiki
This topic describes how ASP.NET Web API converts the return value from a controller action into an HTTP response message. A Web API controller action can return any of the following:
- void
- HttpResponseMessage
- IHttpActionResult
- Other types
Depending on which of these is returned, Web API uses a different mechanism to create the HTTP response.
- void - Return empty 204 (No Content)
- HttpResponseMessage - Convert directly to an HTTP response message.
- IHttpActionResult - Call ExecuteAsync to create an HttpResponseMessage, then convert to an HTTP response message.
- Other type - Write the serialized return value into the response body; return 200 (OK).
If the return type is void, Web API simply returns an empty HTTP response with status code 204 (No Content).
If the action returns an HttpResponseMessage, Web API converts the return value directly into an HTTP response message, using the properties of the HttpResponseMessage object to populate the response. This option gives you a lot of control over the response message.
public class ValuesController : ApiController
{
public HttpResponseMessage Get()
{
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, "value");
response.Content = new StringContent("hello", Encoding.Unicode);
response.Headers.CacheControl = new CacheControlHeaderValue()
{
MaxAge = TimeSpan.FromMinutes(20)
};
return response;
}
}
Response
HTTP/1.1 200 OK
Cache-Control: max-age=1200
Content-Length: 10
Content-Type: text/plain; charset=utf-16
Server: Microsoft-IIS/8.0
Date: Mon, 27 Jan 2014 08:53:35 GMT
hello
If you pass a domain model to the CreateResponse
method, Web API uses a media formatter
to write the serialized model into the response body.
public HttpResponseMessage Get()
{
// Get a list of products from a database.
IEnumerable<Product> products = GetProductsFromDB();
// Write the list to the response body.
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, products);
return response;
}
Web API uses the Accept header in the request to choose the formatter.
The IHttpActionResult
interface was introduced in Web API 2. Essentially, it defines an HttpResponseMessage factory. Here are some advantages of using the IHttpActionResult interface:
- Simplifies unit testing your controllers.
- Moves common logic for creating HTTP responses into separate classes.
- Makes the intent of the controller action clearer, by hiding the low-level details of constructing the response.
IHttpActionResult
contains a single method,ExecuteAsync
, which asynchronously creates an HttpResponseMessage instance.
If a controller action returns an IHttpActionResult
, Web API calls the ExecuteAsync
method to create an HttpResponseMessage
. Then it converts the HttpResponseMessage into an HTTP response message.
public class TextResult : IHttpActionResult
{
string _value;
HttpRequestMessage _request;
public TextResult(string value, HttpRequestMessage request)
{
_value = value;
_request = request;
}
public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
{
var response = new HttpResponseMessage()
{
Content = new StringContent(_value),
RequestMessage = _request
};
return Task.FromResult(response);
}
}
For all other return types, Web API uses a media formatter
to serialize the return value. Web API writes the serialized value into the response body. The response status code is 200 (OK)
.
public class ProductsController : ApiController
{
public IEnumerable<Product> Get()
{
return GetAllProductsFromDB();
}
}
A disadvantage of this approach is that you cannot directly return an error code, such as 404. However, you can throw an HttpResponseException
for error codes.