WebAPI服務返回值

weixin_34208283發表於2017-09-30

Web API 2 Action Result 返回值

  • void
  • HttpResponseMessage
  • IHttpResponseMessage
  • Other Return Type

1void 返回值

返回空值204 (No content)
例:

 #region 空返回值
        [HttpGet]
        public void Post()
        {
            //Console.WriteLine("code good");
        }
Request URL:http://localhost:49064/Products/Post
Request Method:GET
Status Code:204 No Content
Remote Address:[::1]:49064
Referrer Policy:no-referrer-when-downgrade

2HttpResponseMessage 返回值

直接返回HTTP相應訊息
例:

   public HttpResponseMessage GetProduct(int id)
        {
            var product = products.FirstOrDefault(p => p.Id == id);
            if (product == null)
            {
                //NotFound();
                HttpResponseMessage response1 = Request.CreateResponse(HttpStatusCode.NotFound, product);
                return response1;
            }
            HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, product);
            // response.Content = new StringContent(id.ToString(), Encoding.Unicode);
            response.Headers.CacheControl = new CacheControlHeaderValue()
            {
                // MaxAge = TimeSpan.FromMinutes(20)
                MaxAge = TimeSpan.FromMilliseconds(10000)//設定快取時間
               
            };
            return response;
        }
Request URL:http://localhost:49064/Products/Post
Request Method:GET
Status Code:204 No Content
Remote Address:[::1]:49064
Referrer Policy:no-referrer-when-downgrade

3IHttpActionResult返回值

Web API 2中引入了IHttpActionResult,它實質上它定義了一個非同步的HttpActionResult工廠方法

 //
    // 摘要:
    //     定義一個用於以非同步方式建立 System.Net.Http.HttpResponseMessage 的命令。
    public interface IHttpActionResult
    {
        //
        // 摘要:
        //     以非同步方式建立 System.Net.Http.HttpResponseMessage。
        //
        // 引數:
        //   cancellationToken:
        //     要監視的取消請求標記。
        //
        // 返回結果:
        //     在完成時包含 System.Net.Http.HttpResponseMessage 的任務。
        Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken);
    }

如果採用IHttpActionResult作為返回值,Web Api 將會非同步的建立一個HttpResponseMessage型別物件,然後將它直接轉化為Http相應。

下面是一個實現了介面IHttpActionResult的類TextResult,它將返回一個純文字http相應

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);
    }
}

例:

 public IHttpActionResult GetData()
        {
            return new TextResult("純文字資訊", Request);
        }
4942211-775aeca623f1dfe8.png
image.png
4942211-9320ce9306b98626.png
image.png

4其他返回型別

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).
對於其他的返回型別,WebAPI根據媒體型別(MIME)格式化器序列化返回值,然後將其作為Http響應的內容,並且http響應碼都是200.
例:

       /// <summary>
        /// 其他返回型別        
        /// </summary>
        /// <returns></returns>
        public IEnumerable<Product> GetALL()
        {
            return products;
        }

頁面呼叫

 $(document).ready(function () {
      // Send an AJAX request
        $.getJSON("Products/GetALL")
          .done(function (data) {
            // On success, 'data' contains a list of products.
            $.each(data, function (key, item) {
              // Add a list item for the product.
              $('<li>', { text: formatItem(item) }).appendTo($('#product'));
            });
          });
    });

值:

[{"Id":1,"Name":"Hado Daved","Category":"fhjfs","Price":1.0,"start":"2017-09-29T15:12:27.1855723+08:00"},{"Id":2,"Name":"Yo-yo","Category":"Toys","Price":3.75,"start":"2017-09-29T07:12:27.1855723Z"},{"Id":3,"Name":"Hammer","Category":"Hardware","Price":16.99,"start":"2017-09-29T15:12:27.1855723+08:00"}]

頁面通過非同步AJAX呼叫Web
後臺GetALL()方法根據請求的media formatter格式,將資料序列化為json資料。
請求的media formatter型別在HTTP請求響應報文中:

4942211-01fbf4cc5166e481.png
image.png

Web API uses the Accept header in the request to choose the formatter. For more information, see Content Negotiation.
Web API 不只在其他返回值型別,在上述所有的返回值型別中,Web API 實質上都是通過HTTP響應報文的media formatter格式來序列化返回值,(這個請求格式封裝在請求上下文的Request物件的Accept header屬性中)

如還是請求上文的其他返回值型別 GetALL()方法,這次不通過非同步呼叫,直接在瀏覽器地址呼叫

4942211-f406ebe2b3125089.png
image.png

從圖上可以看出請求的是文字型別,響應的也是文字型別。


4942211-6faff8cbfd5192e0.png
image.png

WebAPI序列化後的時間資料格式<start>2017-09-29T15:32:27.5102052+08:00</start>,對於使用過JSON.NET的不會陌生,WEBAPI的序列化方法正是採用的JSON.NET,這比asp.net mvc 的json序列化方法(JavaScriptSerializer)效能高得多。

相關文章