WebAPI服务返回值

2017-09-30  本文已影响615人  凌雲木

Web API 2 Action Result 返回值

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);
        }
image.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请求响应报文中:

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()方法,这次不通过异步调用,直接在浏览器地址调用

image.png

从图上可以看出请求的是文本类型,响应的也是文本类型。


image.png

WebAPI序列化后的时间数据格式<start>2017-09-29T15:32:27.5102052+08:00</start>,对于使用过JSON.NET的不会陌生,WEBAPI的序列化方法正是采用的JSON.NET,这比asp.net mvc 的json序列化方法(JavaScriptSerializer)性能高得多。

上一篇下一篇

猜你喜欢

热点阅读