ASP.NET Web API 將傳回的值轉換從控制器動作至 HTTP 回應訊息的方式。
Web API 控制器動作可以傳回下列其中一項:
- void
- HttpResponseMessage
- IHttpActionResult
- 其他類型
根據這些傳回時,Web API 會使用不同的機制來建立 HTTP 回應。
傳回型別 | Web API 建立回應的方式 |
---|---|
void | 傳回空 204 (沒有內容) |
HttpResponseMessage | 直接將轉換的 HTTP 回應訊息。 |
IHttpActionResult | 呼叫ExecuteAsync來建立HttpResponseMessage,然後將轉換為 HTTP 回應訊息。 |
其他類型 | 將序列化的傳回值寫入至回應主體中;傳回 200 (確定)。 |
本主題的其餘部分描述更詳細的每個選項。
void
如果傳回的型別
void
,Web API 只會傳回空的 HTTP 回應狀態碼 204 (沒有內容)。
範例控制器:
C#
public class ValuesController : ApiController
{
public void Post()
{
}
}
HTTP 回應:
console
HTTP/1.1 204 No Content
Server: Microsoft-IIS/8.0
Date: Mon, 27 Jan 2014 02:13:26 GMT
HttpResponseMessage
如果此動作會傳回HttpResponseMessage,Web API 轉換為傳回值直接 HTTP 回應訊息使用的屬性HttpResponseMessage來填入的物件回應。
此選項可讓您控制回應訊息很多。 例如,下列控制器動作設定 Cache-control 標頭。
C#
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;
}
}
回應:
console
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
如果您傳遞至網域模型CreateResponse方法中,Web API 會使用媒體格式器寫入回應主體中序列化的模型。
C#
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 會使用 Accept 標頭在要求中。 如需詳細資訊,請參閱 < 內容交涉。
IHttpActionResult
IHttpActionResult Web API 2 中引進了介面。 基本上,它會定義HttpResponseMessage factory。 以下是使用的一些優點IHttpActionResult介面:
- 可簡化單元測試控制器。
- 將移到另一個類別建立 HTTP 回應的一般邏輯。
- 藉由隱藏建構回應的低層級的詳細資料可更清楚,控制器動作的意圖。
IHttpActionResult包含單一方法ExecuteAsync,以非同步方式建立HttpResponseMessage執行個體。
C#
public interface IHttpActionResult
{
Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken);
}
如果控制器動作傳回IHttpActionResult,Web API 會呼叫ExecuteAsync方法,以建立HttpResponseMessage。 然後它會將轉換HttpResponseMessage至 HTTP 回應訊息。
以下是簡單的實作的IHttpActionResult所建立的純文字回應:
C#
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);
}
}
範例控制器動作:
C#
public class ValuesController : ApiController
{
public IHttpActionResult Get()
{
return new TextResult("hello", Request);
}
}
回應:
console
HTTP/1.1 200 OK
Content-Length: 5
Content-Type: text/plain; charset=utf-8
Server: Microsoft-IIS/8.0
Date: Mon, 27 Jan 2014 08:53:35 GMT
hello
通常您會使用IHttpActionResult中所定義的實作**System.Web.Http.Results** 命名空間。 ApiController類別定義會傳回這些內建動作結果的 helper 方法。
在下列範例中,如果要求不符合現有的產品識別碼,控制器會呼叫ApiController.NotFound建立 404 (找不到) 回應。 否則,控制器會呼叫ApiController.OK,這會建立 200 (確定) 回應,包含產品。
C#
public IHttpActionResult Get (int id)
{
Product product = _repository.Get (id);
if (product == null)
{
return NotFound(); // Returns a NotFoundResult
}
return Ok(product); // Returns an OkNegotiatedContentResult
}
其他傳回型別
C#
public class ProductsController : ApiController
{
public IEnumerable<Product> Get()
{
return GetAllProductsFromDB();
}
}
若要選擇的格式器,web API 會使用 Accept 標頭在要求中。 如需詳細資訊,請參閱 < 內容交涉。
範例要求
console
GET http://localhost/api/products HTTP/1.1
User-Agent: Fiddler
Host: localhost:24127
Accept: application/json
範例回應:
console
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Server: Microsoft-IIS/8.0
Date: Mon, 27 Jan 2014 08:53:35 GMT
Content-Length: 56
[{"Id":1,"Name":"Yo-yo","Category":"Toys","Price":6.95}]
留言
張貼留言