WebAPi返回类型到底应该是什么才合适,这是个问题?
前言
有些问题只有真正遇到或者用到并且多加思考才会想到,平常若作为自学的心态去学习则不会考虑太多,我慢慢明白对于那些有太多要学的东西或者说的更加明确而且具体一点的话,如果对于你现在不是迫切要学或者需要掌握的技能,那就暂且放在一边吧,比如现在比较火的angular和react,我之前也花时间去学了,但是公司压根不用或者有专门的前端你学多了貌似没什么很大的实际用途,其实仅仅做一点基本的了解即可,至少别人问起也知道一二,不要看到别人学什么或者火了什么就盲目跟风,还是根据自身实际情况来学习才是王道。这不刚说到根据自身来学习,脑袋妄想着正在做的项目,突然冒出一个想法,为什么那不可以,为什么它又存在呢?这篇文章就出来了。
话题介绍
我们知道在WebAPi中对于响应结果我们都是这样用的:
public HttpResponseMessage GetResult<T>(T t)
{
return Request.CreateResponse<T>(HttpStatusCode.OK, t);
}
在项目中前端为了和其他统一,封装了一套响应的结果和状态码,要求直接返回对象,于是将上述修改成比如如下:
public Result<List<Person>> GetResult()
{
var result = new Result<List<Person>>();
return result;
} public class Result<T> : BaseResult
{
public T Data;
} public class BaseResult
{
public string Message;
public int Status;
public ErrorCode ErrorCode;
} public enum ErrorCode
{
......
}
统观以上两种方法,一种是WebAPi内置响应的结果,另外一种则是直接返回自定义响应结果。
于是乎,我开始思索这两种方法虽然都能得到我们想要的结果,但是有什么区别没有呢?说的更加明确一点的是,二者在数据响应上有没有性能上的差异呢?
WebAPi响应结果和自定义响应结果二者性能差异
以上则是需要返回对象来进行处理,而有些我们则不需要返回任何对象来进行处理例如直接返回void,而在WebAPi中对应需要返回 IHttpActionResult 例如自定义返回则是如下:
public void GetFirst()
{.....}
在WebAPi中则是进行如下返回:
public IHttpActionResult GetSecond()
{
return OK();
}
下面我们在控制台中分别来测试这二者在WebHost以及在SelfHost上的差异,我们如何获取其差异呢?我们通过对void方法和http方法在控制台中发出1000个请求来获取其总共花费时间来进行比较。
SelfHost
[HttpGet]
public void GetFirst()
{
StringBuilder stringbuilder = new StringBuilder();
for (int i = ; i < ; i++)
{
stringbuilder.Append("something");
}
} [HttpGet]
public IHttpActionResult GetSecond()
{
StringBuilder stringbuilder = new StringBuilder();
for (int i = ; i < ; i++)
{
stringbuilder.Append("something");
}
return Ok();
}
在控制台中方法如下:
private const string voidUrl = "http://localhost:8080/api/home/GetFirst";
private const string httpUrl = "http://localhost:8080/api/home/GetSecond";
private static List<TimeSpan> voidTimes = new List<TimeSpan>();
private static List<TimeSpan> httpTimes = new List<TimeSpan>();
static void Main(string[] args)
{
Console.WriteLine("Start Test....");
for (int i = ; i < ; i++)
{
voidTimes.Add(getResponse(voidUrl));
Thread.Sleep();
Console.WriteLine("void Test " + i);
}
Console.WriteLine("Finished Void Test");
for (int i = ; i < ; i++)
{
httpTimes.Add(getResponse(httpUrl));
Thread.Sleep();
Console.WriteLine("http Test " + i);
}
Console.WriteLine("Finished Http Test");
var voidTotalTime = voidTimes.Sum(t => t.Milliseconds);
Console.WriteLine("void方法发出1000个请求总共需要时间:" + voidTotalTime);
Console.WriteLine("void方法平均每一个请求需要时间:" + voidTotalTime / 1000.00 + "秒"); var httpTotalTime = httpTimes.Sum(t => t.Milliseconds);
Console.WriteLine("http方法发出1000个请求总共需要时间: " + httpTotalTime);
Console.WriteLine("http方法平均每一个请求需要时间: " + httpTotalTime / 1000.00 + "秒"); Console.Read();
} static TimeSpan getResponse(string url)
{
var stopWatch = new Stopwatch();
stopWatch.Start();
var httpClient = new HttpClient();
httpClient.BaseAddress = new Uri(url);
var task = httpClient.GetAsync(httpClient.BaseAddress).Result;
var result = task.Content.ReadAsAsync(typeof(object));
var timeSpan = stopWatch.Elapsed;
stopWatch.Stop();
return timeSpan;
}
下面我们来直观演示整个过程:

从上看出似乎由http方法节约一点时间,我们将上述中的方法循环次数,进行如下修改:
for (int i = ; i < ; i++)
{
stringbuilder.Append("something");
}
这时候我们再来看看结果:

当有二十万条数据时此时时间又多节约一点点。接下来我们再来测试WebHost。
WebHost
在WebHost中我们利用特性来管理请求方法:
[HttpGet]
[Route("test/void")]
public void GetFirst()
{
StringBuilder stringbuilder = new StringBuilder();
for (int i = ; i < ; i++)
{
stringbuilder.Append("something");
}
} [HttpGet]
[Route("test/IHttpActionResult")]
public IHttpActionResult GetSecond()
{
StringBuilder stringbuilder = new StringBuilder();
for (int i = ; i < ; i++)
{
stringbuilder.Append("something");
}
return Ok();
}
此时将控制台请求地址进行对应修改即可:
private const string voidUrl = "http://localhost:2531/test/void";
private const string httpUrl = "http://localhost:2531/test/IHttpActionResult";
此时演示结果如下:

此时快了接近一秒。此时我们将数据增加到同样20万时再看看:

此时还是快了1秒。到了这里是不是就算结束了呢,我们再来看看
当我们请求void方法时返回的状态码为如下:

此时利用http来进行响应则是如下:

其返回状态也不同,我们则需要有对应的处理方式。
总结
在演示void方法和http方法时有时也会出现http方法时间比void方法慢的原因,不知是何缘故,理论上来说用HttpResponseMessage来作为响应结果会快一点,因为HttpResponseMessage内置对于一些异常都做了处理并返回对应的状态码而void方法则未做任何处理。但是从另外一个角度看,若我们自定义一套返回的状态码来进行处理也并非不可,个人觉得利用WebAPi内置的HttpResponseMessage响应机制来进行结果响应最佳,期待各位的批评和答案,同时不知上述测试是否合理。当时想到这个问题时也查了相关资料,还真有做过类似测试的,于是借用了一下。
WebAPi返回类型到底应该是什么才合适,这是个问题?的更多相关文章
- asp.net core系列 38 WebAPI 返回类型与响应格式--必备
一.返回类型 ASP.NET Core 提供以下 Web API Action方法返回类型选项,以及说明每种返回类型的最佳适用情况: (1) 固定类型 (2) IActionResult (3) Ac ...
- WebApi返回类型设置为json的三种方法
web api写api接口时默认返回的是把你的对象序列化后以XML形式返回,那么怎样才能让其返回为json呢,下面就介绍两种方法: 方法一:(改配置法) 找到Global.asax文件,在Applic ...
- webapi 返回类型
参考 大神;https://www.cnblogs.com/landeanfen/p/5501487.html
- webapi返回文件流
逻辑说明 webapi返回类型为IHttpActionResult接口,内部方法返回HttpResponseMessage. public interface IHttpActionResult { ...
- QT5中编译存在的几个问题(LNK2019,构造函数不能有返回类型)
1. 自己构造新类,注意必须在头文件最后加上分号 写个c++类报“构造函数不能有返回类型”, 谷歌一下,才找到原因: 原来是我定义的类后面没有用“:”结尾,构造函数默认把整个类作为返回值了 2. 新建 ...
- webapi的返回类型,webapi返回图片
1.0 首先是返回常用的系统类型,当然这些返回方式不常用到.如:int,string,list,array等.这些类型直接返回即可. public List<string> Get() { ...
- 关于webapi 返回的类型的笔记
经过测试发现使用IE浏览器返回的数据是json,而使用Firefox和Chrome返回的则为xml,经研究发现IE在发生http请求时请求头accpet节点相比Firefox和Chrome缺少&quo ...
- 【转载】C#.NET WebApi返回各种类型(图片/json数据/字符串),.net图片转二进制流或byte
C#.NET WebApi返回各种类型(图片/json数据/字符串),.net图片转二进制流或byte 转载:http://www.itdos.com/Mvc/20150302/0741255.htm ...
- ASP.NET Core WebAPI控制器返回类型的最佳选项
前言 从.NET Core 2.1版开始,到目前为止,控制器操作可以返回三种类型的WebApi响应.这三种类型都有自己的优点和缺点,但都缺乏满足REST和高可测性的选项. ASP.NET Core中可 ...
随机推荐
- Jsonp原理就是这么简单
原理就是:包裹数据的js数据文件,自动执行,找到目标函数,通过传参,把数据注入进去. 当你打开本篇博文,证明你已经大体知道了Jsonp的作用了. 但如果需要我介绍一下,我也可以简单介绍: 简单说,就是 ...
- python lxml install
之前记得安装libxslt和libxml yum install libxml* -yyum install libxslt* -y wget http://lxml.de/files/lxml-3. ...
- 误删/usr文件夹解决办法
http://blog.chinaunix.net/uid-2623904-id-3044156.html http://www.centoscn.com/CentOS/Intermediate/20 ...
- HOW TO RUN A SPRINT PLANNING MEETING (THE WAY I LIKE IT)
This is a sample agenda for a sprint planning meeting. Depending on your context you will have to ch ...
- (学)解决诡异的 Exception type: SocketException 127.0.0.1:80
许久不发博了,老杨听完故事让我持续写一下“十万个为什么” 一.背景: 昨天我们亲密的战友HH刘老板亲临现场,指出我们协用的一个项目,客户方面反馈手持终端系统不定期“卡死”,要我们安排人飞到广州驻场解 ...
- Mimikatz 使用Tips
1.记录 Mimikatz输出: C:\>mimikatz.exe ""privilege::debug"" ""log sekurl ...
- spring mvc + ehcache 利用注解实现缓存功能
我的spring是3.1的,因为项目需求,需要在查询时候加上缓存,小白一个,完全没有用过缓存(ehcache),摸索了一天终于会了一点通过注解来使用ehcache进行缓存,立刻给记录下来. 首先 我的 ...
- PHP常用算法
//二维数组的按某字段来排序(从小到大排序) function number_array_sort_asc($array,$key_name){ $arr = array(); foreach ($a ...
- Spring之注入的几种方式
普通注入 在配置文件里 <!-- 构造注入 --> <bean id="user1" class="entity.User"> < ...
- 通过js实现回到顶部功能
许多商城网址,当我们滚动到一定高度时,我们会发现一般会出现一个回到顶部的js选项,点击轻松实现回到顶部,交互效果会显得比较人性化,且回到顶部过程中若在滚动滚动条时可以停止滚动,现在让我们来实现吧 我总 ...