WebAPi返回类型到底应该是什么才合适,这是个问题?
前言
有些問題只有真正遇到或者用到并且多加思考才會想到,平常若作為自學(xué)的心態(tài)去學(xué)習(xí)則不會考慮太多,我慢慢明白對于那些有太多要學(xué)的東西或者說的更加明確而且具體一點的話,如果對于你現(xiàn)在不是迫切要學(xué)或者需要掌握的技能,那就暫且放在一邊吧,比如現(xiàn)在比較火的angular和react,我之前也花時間去學(xué)了,但是公司壓根不用或者有專門的前端你學(xué)多了貌似沒什么很大的實際用途,其實僅僅做一點基本的了解即可,至少別人問起也知道一二,不要看到別人學(xué)什么或者火了什么就盲目跟風(fēng),還是根據(jù)自身實際情況來學(xué)習(xí)才是王道。這不剛說到根據(jù)自身來學(xué)習(xí),腦袋妄想著正在做的項目,突然冒出一個想法,為什么那不可以,為什么它又存在呢?這篇文章就出來了。
話題介紹
我們知道在WebAPi中對于響應(yīng)結(jié)果我們都是這樣用的:
public HttpResponseMessage GetResult<T>(T t){return Request.CreateResponse<T>(HttpStatusCode.OK, t);}在項目中前端為了和其他統(tǒng)一,封裝了一套響應(yīng)的結(jié)果和狀態(tài)碼,要求直接返回對象,于是將上述修改成比如如下:
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{......}統(tǒng)觀以上兩種方法,一種是WebAPi內(nèi)置響應(yīng)的結(jié)果,另外一種則是直接返回自定義響應(yīng)結(jié)果。
于是乎,我開始思索這兩種方法雖然都能得到我們想要的結(jié)果,但是有什么區(qū)別沒有呢?說的更加明確一點的是,二者在數(shù)據(jù)響應(yīng)上有沒有性能上的差異呢?
WebAPi響應(yīng)結(jié)果和自定義響應(yīng)結(jié)果二者性能差異
以上則是需要返回對象來進行處理,而有些我們則不需要返回任何對象來進行處理例如直接返回void,而在WebAPi中對應(yīng)需要返回?IHttpActionResult?例如自定義返回則是如下:
public void GetFirst(){.....}在WebAPi中則是進行如下返回:
public IHttpActionResult GetSecond(){return OK(); }下面我們在控制臺中分別來測試這二者在WebHost以及在SelfHost上的差異,我們?nèi)绾潍@取其差異呢?我們通過對void方法和http方法在控制臺中發(fā)出1000個請求來獲取其總共花費時間來進行比較。
SelfHost
[HttpGet]public void GetFirst(){StringBuilder stringbuilder = new StringBuilder();for (int i = 0; i < 20; i++){stringbuilder.Append("something");}}[HttpGet]public IHttpActionResult GetSecond(){StringBuilder stringbuilder = new StringBuilder();for (int i = 0; i < 20; 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 = 0; i < 1000; i++){voidTimes.Add(getResponse(voidUrl));Thread.Sleep(10);Console.WriteLine("void Test " + i);}Console.WriteLine("Finished Void Test");for (int i = 0; i < 1000; i++){httpTimes.Add(getResponse(httpUrl));Thread.Sleep(10);Console.WriteLine("http Test " + i);}Console.WriteLine("Finished Http Test");var voidTotalTime = voidTimes.Sum(t => t.Milliseconds);Console.WriteLine("void方法發(fā)出1000個請求總共需要時間:" + voidTotalTime);Console.WriteLine("void方法平均每一個請求需要時間:" + voidTotalTime / 1000.00 + "秒");var httpTotalTime = httpTimes.Sum(t => t.Milliseconds);Console.WriteLine("http方法發(fā)出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方法節(jié)約一點時間,我們將上述中的方法循環(huán)次數(shù),進行如下修改:
for (int i = 0; i < 200000; i++){stringbuilder.Append("something");}這時候我們再來看看結(jié)果:
當(dāng)有二十萬條數(shù)據(jù)時此時時間又多節(jié)約一點點。接下來我們再來測試WebHost。
WebHost
在WebHost中我們利用特性來管理請求方法:
[HttpGet][Route("test/void")]public void GetFirst(){StringBuilder stringbuilder = new StringBuilder();for (int i = 0; i < 20; i++){stringbuilder.Append("something");}}[HttpGet][Route("test/IHttpActionResult")]public IHttpActionResult GetSecond(){StringBuilder stringbuilder = new StringBuilder();for (int i = 0; i < 20; i++){stringbuilder.Append("something");}return Ok();}此時將控制臺請求地址進行對應(yīng)修改即可:
private const string voidUrl = "http://localhost:2531/test/void";private const string httpUrl = "http://localhost:2531/test/IHttpActionResult";此時演示結(jié)果如下:
此時快了接近一秒。此時我們將數(shù)據(jù)增加到同樣20萬時再看看:
?
此時還是快了1秒。到了這里是不是就算結(jié)束了呢,我們再來看看
當(dāng)我們請求void方法時返回的狀態(tài)碼為如下:
此時利用http來進行響應(yīng)則是如下:
其返回狀態(tài)也不同,我們則需要有對應(yīng)的處理方式。
總結(jié)
在演示void方法和http方法時有時也會出現(xiàn)http方法時間比void方法慢的原因,不知是何緣故,理論上來說用HttpResponseMessage來作為響應(yīng)結(jié)果會快一點,因為HttpResponseMessage內(nèi)置對于一些異常都做了處理并返回對應(yīng)的狀態(tài)碼而void方法則未做任何處理。但是從另外一個角度看,若我們自定義一套返回的狀態(tài)碼來進行處理也并非不可,個人覺得利用WebAPi內(nèi)置的HttpResponseMessage響應(yīng)機制來進行結(jié)果響應(yīng)最佳,期待各位的批評和答案,同時不知上述測試是否合理。當(dāng)時想到這個問題時也查了相關(guān)資料,還真有做過類似測試的,于是借用了一下。
參考資料:http://stackoverflow.com/questions/22689888/webapi-2-is-a-void-response-faster-then-ihttpactionresult
?
轉(zhuǎn)載于:https://www.cnblogs.com/CreateMyself/p/5838467.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的WebAPi返回类型到底应该是什么才合适,这是个问题?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高效办公软件推荐——文件搜索类
- 下一篇: 程序员专用壁纸!!!