ASP.NET Web API 將傳回的值轉換從控制器動作至 HTTP 回應訊息的方式。

Web API 控制器動作可以傳回下列其中一項:
  1. void
  2. HttpResponseMessage
  3. IHttpActionResult
  4. 其他類型
根據這些傳回時,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
}

其他傳回型別

對於所有其他傳回類型,Web API 會使用媒體格式器序列化傳回的值。 Web API 會寫入回應主體中序列化的值。 回應狀態碼為 200 (確定)。
C#
public class ProductsController : ApiController
{
    public IEnumerable<Product> Get()
    {
        return GetAllProductsFromDB();
    }
}
這種方法的缺點是您不能直接傳回錯誤碼 404 等。 不過,您可以擲回HttpResponseException錯誤代碼。 如需詳細資訊,請參閱 < ASP.NET Web API 中的例外狀況處理
若要選擇的格式器,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}]

留言

這個網誌中的熱門文章

[C#]Windows 10 停用與啟用網路卡(連線)[手把手教程][原創]

[C#]程式更改電腦IP位置與電腦名稱