wcf虽然功能多、扩展性强但是也面临配置忒多,而且restful的功能相当怪异,并且目前没法移植。asp.net core虽然支持webapi,但是功能也相对繁多、配置复杂。就没有一个能让码农们安安心心的写webapi,无需考虑性能、配置、甚至根据问题场景自行设计、改造等问题的方案么?

  当然不是,特别是在dnc2.0已经相当强大的此时,完全可以自行设计一套简洁、高效的webapi框架!说到自行写一套框架,很多码农们就可能会想到开发工作量难以想像,事实真的如此么?java因为开源众多,很多对mvc稍有了解的都可以拿这个拿那个拼出一个自已的mvc框架;而面对日益强大的dnc,本人觉得C#根本无需东拼西凑这么麻烦,完全可以根据自已的需求简单快速的写出一个来,不服就开干!

  设计的编码思路就是仿asp.net mvc,原因就是asp.net mvc成功发展了这么多年,有着大量的C#码农习惯了这套优良的编码方式;至于spring mvc、spring boot那些,站在使用者的角度来说,光配置和注解都能敲死人,如要要说简洁快速,asp.net mvc比他强多了,更别提ruby on rails。不扯远了,下面就按C#经典来。那么需要考虑的问题有tcp、http、request、response、server、controller、actionresult、routetable等,下面就一一来解决这个问题。

  一、Tcp:这个是实现传输通信的底层,当然采用IOCP来提高吞吐量和性能,本人之前在做Redis Client等的时候就使用这个IOCP Socket的框架,此时正好也可以用上

  二、Http:这个是个应用协议,本人了解下来至少有3个版本,完全熟悉的话估计没个半年都搞不定;但是只需要关键,比如说http1.1的工作模式、传输格式、常见异常code、常见mime类型、js跨域支持等,这些基本能覆盖绝大部分日常场景,至于更多的那些细枝末节的理它作甚,本人的做法就是用Chrome的开发人员工具来查看相关network详情,这样的话就可以清楚http这个协议的具体编码解码了。

  经过分析后http的内容格式其实就是字符回车分隔,再加上一些约定生成的分隔符bound完成的。

  看到上面,有人肯定会说你这个传文件咋办?一个呢本人这个是针对webapi;另外一个,如真有这个场景,可以用Chrome的开发人员工具来查看相关network详情,也可以使用httpanalyzerstd、httpwatch等众多工具分析下,其实也就是使用了一些约定的分隔符bound完成,每个浏览器还不一样,有兴趣的完全可以自行扩展一个。

  三、Reponse这个是webapi服务端相当重要的一个组件,本人也是尽可能方便并且按尽量按asp.net mvc的命名来实现,另外这里加入支持js跨域所需大部分场景heads,如果还有特殊的heads,完全可以自已添加。

 四、HttpServer:这个就是承载webapi的容器;有人说不是有IIS和Apache么?本人想说的是:有self-host方便么?有无需安装,无需配置、随便高性能开跑好么?asp.net core里面都有了这个,没这个就没有逼格....(此处省略一万字),前面还研究tcp、http这个当然不能少了

  五、Controller:为了实现类似于mvc的效果Controller这个大名鼎鼎的当然不能少了,其在C#中使用非常少量的代码即可实现

  六、ActionResult:是mvc里面针对reponse结果进行了一个http格式的封装,本人主要实现了ContentResult、JsonResult、FileResult三个,至于其他的在WebAPI里基本上用不到。

 

  七、RouteTable:MVC里面有一个相当重要的概念叫约定优先,即为Controller、Action的名称是按某种规则来写编码的,其中将URL与自定义Controller对应起来的缓存映射就是RouteTable,并且作为缓存,也能极大的提升访问性能。当然这里并没有严格按照asp.net mvc里面的routetable来设计,而是根据只是实现webapi,并使用缓存反射结构能来实现的,并且只有约定,没有配置。

  在MVC的思想里面ActionFilterAtrribute的这个AOP设计也一直伴随左右,比如记日志、黑名单、权限、验证、限流等等功能,所以路由的时候也会缓存这个。至此一些关键性的地方都已经弄的差不多了,为了更好的了解上面说的这些,下面是vs2017中项目的结构截图:

  纯粹干净单码,无任何晦涩内容,如果对mvc有一定了解的,这个差不多可以NoNotes,接下来就是按asp.net mvc命名方式,写个测试webapi看看情况,首先还是测试项目结构图:

  

  HomeController里面按asp.net mvc的习惯来编写代码:

response.Write("<h3>测试一下那个response对象使用情况!</h3>参考消息网4月12日报道外媒称,法国一架“幻影-2000”战机意外地对本国一家工厂投下了...");

 

  program.cs Main中启动一下服务:

 MvcApplication mvcApplication = new MvcApplication(); mvcApplication.Start();

  最后F5跑起来看看效果:

  使用Apache ab.exe压测一下性能如何:

  至此,一个简洁、高效的WebApi就初步完成了!

转载请标明本文来源:http://www.cnblogs.com/yswenli/p/8858669.html
更多内容欢迎star作者的github:https://github.com/yswenli/SAEA

原文链接:https://www.cnblogs.com/yswenli/p/8858669.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

自行实现高性能MVC相关推荐

  1. 2019公众号总结之——Top100 技术文章汇总

    大家好,我是张善友.新年伊始,我们在欢送10年代的同时迎来了20年代.在这个崭新的时代,感谢各位朋友一直关注"dotnet跨平台".一晃5年有余,关注公众号的粉丝6万,相对于.NE ...

  2. 2014年5月份第3周51Aspx源码发布详情

    HGM简单连连看游戏源码  2014-5-19 [VS2010]源码描述:这是一款基于WinForm窗体程序的简单水果连连看的小游戏.界面比较美观, 功能如下:该游戏可以显示当前关卡,还有剩余时间.重 ...

  3. component-scan和annotation-driven

    <context:component-scan/> 该xml配置作用是启动Spring的组件扫描功能,自动扫描base-package指定的包及其子文件下的java文件,如果扫描到有@co ...

  4. 如何免安装服务器将 React 整合进 Spring Boot

    如何免安装服务器将 React 整合进 Spring Boot 下载 Spring Boot 官方 demo 下载 React 官方 demo 开始整合 使用 Spring MVC 控制器导向 Rea ...

  5. SG-UAP电网项目开发简介

    好久没写博客了,最近接触了一个国网项目,使用了 SG-UAP,感觉颇有价值,特记录如下,供需要的人参考. 一.安装 SG-UAP (全称国家电网统一应用平台State Grid Unified App ...

  6. 关于XPS的一点思考(1)-XPS的起源

    XPS是2012年为国内某股份制商业银行开发的一套信用卡业务流程处理系统,基于公司的Workbench 2.0框架进行开发.所谓Workbench 2.0,实际是2009年我在公司的Workbench ...

  7. MVP+Dragger2+Rxjava2+Retrofit+OKhttp进行开发。

    MVP+Dragger2+Rxjava2+Retrofit+OKhttp框架已经流行很长时间,而且也必将成为未来android开发的趋势,在使用这个框架的过程中踩过很多坑, 所以想把我的经验告诉大家, ...

  8. swoole-swoole是什么能做什么

    近半年来努力付出,项目终于要正式结项了,团队4人经历了很多困难,加班加点,最终完成了! 剩下的时间将总结一下在该项目中用到知识和遇到问题.今天就从swoole说起! 项目中实现异步大文件传输的功能,在 ...

  9. 高性能的关键:Spring MVC的异步模式

    什么是异步模式 要知道什么是异步模式,就先要知道什么是同步模式,先看最典型的同步模式: (图1) 浏览器发起请求,Web服务器开一个线程处理,处理完把处理结果返回浏览器.好像没什么好说的了,绝大多数W ...

最新文章

  1. mysql shharding_mysql 技术内幕 的示例数据库
  2. 30万奖金海华AI挑战赛 | 用机器挑战中文阅读理解
  3. mybatis和ehcache整合
  4. Atitit 深入理解软件的本质 attilax总结 软件三原则三次原则是DRY原则和YAGNI原则的折
  5. CAD线型设置:CAD软件中如何加粗曲线?
  6. Top 10 JavaScript编辑器,你在用哪个?
  7. 硬盘服务器哪个好用吗,服务器用固态硬盘好还是机械硬盘好
  8. 现货白银最低门槛是啥?
  9. python3爬虫有道翻译_【Python3爬虫】有道翻译
  10. 「Adobe国际认证」关于Photoshop选择并遮住工作区,用户界面介绍
  11. 2023年上半年软考报考指南~
  12. java解决撞库的问题_Web安全开发之验证码设计不当引发的撞库问题
  13. ffmpeg命令行视频剪辑与拼接
  14. 如何卸载Oracle数据库
  15. 使用conda安装pytorch时出现PackagesNotFoundError: The following packages are not available from current chan
  16. CEF3:用CEF3实现最简单的浏览器
  17. 用户行为分析需求规格说明书
  18. CodeForces 985E Pencils and Boxes
  19. Python 模拟登陆百度云盘实战教程
  20. Broadcasts在Android7.0以及Android8.0中的变更

热门文章

  1. 常用MIME类型(Flv,Mp4的mime类型设置)
  2. 开通博客园,新的网络生活的开始
  3. 如何在Microsoft Excel中将文本转换为日期值
  4. minecraft服务器_如何使用Minecraft领域设置简单的无压力Minecraft服务器
  5. plex实现流媒体服务器_如何从Plex Media Server离线查看下载和同步媒体
  6. rails generator
  7. Fiddler抓包5-接口测试(Composer)
  8. GPhone、OPhone、UPhone、APhone、IPhone:满城尽带XPhone
  9. ORACLE 11G DATA GUARD主从切换
  10. C# 操作FireBird 附源码