WebAPI服务返回值
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);
}
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请求响应报文中:
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)性能高得多。