惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Simon Willison's Weblog
Simon Willison's Weblog
V
Vulnerabilities – Threatpost
C
Cisco Blogs
C
Cybersecurity and Infrastructure Security Agency CISA
Latest news
Latest news
T
Threatpost
C
CXSECURITY Database RSS Feed - CXSecurity.com
T
Tor Project blog
月光博客
月光博客
罗磊的独立博客
H
Help Net Security
Recent Announcements
Recent Announcements
L
Lohrmann on Cybersecurity
Know Your Adversary
Know Your Adversary
N
Netflix TechBlog - Medium
I
InfoQ
NISL@THU
NISL@THU
WordPress大学
WordPress大学
博客园_首页
IT之家
IT之家
GbyAI
GbyAI
小众软件
小众软件
C
Check Point Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Cloudbric
Cloudbric
P
Proofpoint News Feed
J
Java Code Geeks
博客园 - 司徒正美
L
LINUX DO - 热门话题
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
S
Schneier on Security
博客园 - Franky
C
Cyber Attacks, Cyber Crime and Cyber Security
S
Securelist
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
美团技术团队
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Cyberwarzone
Cyberwarzone
G
GRAHAM CLULEY
T
Tailwind CSS Blog
P
Privacy & Cybersecurity Law Blog
Engineering at Meta
Engineering at Meta
爱范儿
爱范儿
Project Zero
Project Zero
P
Proofpoint News Feed
阮一峰的网络日志
阮一峰的网络日志
T
The Blog of Author Tim Ferriss
T
Tenable Blog

博客园 - YbSoftwareFactory

YbSoftwareFactory 代码生成插件【二十五】:Razor视图中以全局方式调用后台方法输出页面代码的三种方法 YbSoftwareFactory 代码生成插件【二十四】:MVC中实现动态自定义路由 YbSoftwareFactory 代码生成插件【二十三】:集成强大的公文流转系统 YbSoftwareFactory 代码生成插件【二十二】:CMS基础功能的实现 YbSoftwareFactory 代码生成插件【二十】:DynamicObject的序列化 YbSoftwareFactory 代码生成插件【十九】:实体类配合数据库表字段进行属性扩展的小技巧 YbSoftwareFactory 代码生成插件【十八】:树形结构下的查询排序的数据库设计 YbSoftwareFactory 代码生成插件【十七】:先进的权限模型体系设计 YbSoftwareFactory 代码生成插件【十六】:Web 下灵活、强大的审批流程实现(含流程控制组件、流程设计器和表单设计器) YbSoftwareFactory 代码生成插件【十五】:Show 一下最新的动态属性扩展功能与键值生成器功能 YbSoftwareFactory 代码生成插件【十四】:通过 DynamicLinq 简单实现 N-Tier 部署下的服务端数据库通用分页 YbSoftwareFactory 代码生成插件【十三】:Web API 的安全性 YbSoftwareFactory 代码生成插件【十二】:超级灵活方便的应用程序设置管理API YbSoftwareFactory 代码生成插件【十一】:ASP.NET WebApi MVC下组织机构管理和菜单权限管理的实现 YbSoftwareFactory 代码生成插件【十】:ASP.NET WebApi MVC下审计、缓存和导出功能的实现 YbSoftwareFactory 代码生成插件【九】:基于JQuery、WebApi的ASP.NET MVC插件的代码生成项目主要技术解析 YbSoftwareFactory 代码生成插件【八】:基于JQuery EasyUI、Web Api的 ASP.NET MVC 代码生成插件 YbSoftwareFactory 代码生成插件【七】:YbRapidSolution for WinForm 插件生成项目总体架构介绍 YbSoftwareFactory 代码生成插件【六】:WinForm 完美解决方案的代码生成插件
YbSoftwareFactory 代码生成插件【二十一】:Web Api及MVC性能提升的几个小技巧
YbSoftwareFactory · 2014-12-22 · via 博客园 - YbSoftwareFactory

    最近在进行 YbSoftwareFactory 的流程功能升级,目前已经基本完成,现将用到的一些关于 Web Api 及 MVC 性能提升的一些小技巧进行了总结,这些技巧在使用、配置上也相当的简单,但通常都能大大提高应用程序的性能,希望对大家有用。

一、缓存

    为了避免每次请求都去访问后台的资源,我们一般会考虑将一些更新不是很频繁的,可以重用的数据,通过一定的方式临时地保存起来,后续的请求根据情况可以直接访问这些保存起来的数据,这种机制就是所谓的缓存机制。缓存分为页面输出缓存,内存数据缓存和缓存依赖等。从设计原则来说,易变性、敏感性的信息不适合进行缓存,同时缓存的内容也是易丢失的,在代码中不能完全依赖于缓存的数据,需要保证在缓存的数据丢失后也能进行正确的处理。

    1、页面输出缓存

    通过对输出的页面进行缓存,每次新的用户请求调用相同的 Action 时,相同的内容不需要重新创建一次而直接输出。页面输出缓存的使用非常简单,在 Action 上使用 [OutputCache] 特性标记即可生效。页面输出缓存可控制缓存的内容所存储的位置,例如是在服务器端存储缓存的页面内容还是在客户端存储缓存的页面内容;也可使用 Duration 参数控制缓存的失效绝对时间和间隔时间,甚至能使用 VaryByParam 参数对不同的请求参数分别进行缓存。页面输出缓存非常适合于内容比较固定的前端页面的缓存。

    2、内存数据缓存

    通常情况下,数据是保存在数据库、磁盘文件等存储介质中的,而应用程序访问这些资源是一项很费时的操作。如果先将这些资源中的数据缓存到内存缓存区中,当应用程序需要这些数据时,直接从缓存区中提取,就可以减少系统开销,显著提高可使用的用户并发数等。内存数据缓存需考虑缓存的内容更改失效后如何清空其他已经被缓存的相关联的数据问题。

    3、EFCache

    众所周知,NHiberate 提供了二级缓存功能。现在,如果你使用的是 Entity Framework 6 或更高版本的 Entity Framework ,你也可考虑使用 EFCache 组件来为 Entity Framework 提供二级缓存支持,其实质上也是属于内存数据缓存。EFCache 的特点是使用上非常方便,仅需定义如下的代码无需其他复杂的额外的配置即可实现二级缓存。如需定义特定的缓存策略,如缓存的过期时间,控制数据缓存的范围,也仅需继承 CachingPolicy 类并 override 其部分方法即可。你甚至可以通过实现 ICache 接口来实现自定义的缓存模型以替换默认的 InMemoryCache 。

    经测试,使用 EFCache 后,通常性能的提升均是显而易见的。其参考代码如下:

 1     /// <summary>
 2     /// EF二级缓存配置,如无需二级缓存请注释如下类定义
 3     /// </summary>
 4     public class Configuration : DbConfiguration
 5     {
 6         private static InMemoryCache _cache = new InMemoryCache();
 7         public Configuration()
 8         {
 9             var transactionHandler = new CacheTransactionHandler(_cache);
10 
11             AddInterceptor(transactionHandler);
12 
13             var cachingPolicy = new CachingPolicy();
14 
15             Loaded +=
16               (sender, args) => args.ReplaceService<DbProviderServices>(
17                 (s, _) => new CachingProviderServices(s, transactionHandler,
18                   cachingPolicy));
19         }
20         public static void ClearCache()
21         {
22             _cache.Purge();
23         }
24     }

二、Stream压缩

    对响应流进行压缩,其作用是减少网络开销,提高系统的响应速度。目前的浏览器通常都支持 gzip 和 deflate 压缩解压功能,因此你通常无效考虑浏览器的兼容性问题。启用 gzip 和 deflate ,既可通过 IIS 配置实现,在 MVC 中也可通过编写自定义的 ActionFilter 实现。在压缩之前和压缩之后 Stream 的大小差异通常都是惊人的,其压缩率通常都在5-10倍以上。

    具体可看看如下的监视数据:

 

三、js和css文件的压缩和打包

    1、js 和 css 文件的压缩

    其实质就是生成较小的文件,减小下载这些文件的网络开销,提供系统的响应速度。压缩 js 和 css 文件还有个好处是通常还可以起到代码混淆的作用。在 YbSoftwareFactory 的 MVC 解决方案中,使用的是 Microsoft Ajax Minifier 组件,可在代码编译的过程中自动对所配置的 js 和 css 进行压缩,基本上文件的大小都可减少一半以上:

    在 YbSoftwareFactory 的 MVC 解决方案中,巧妙使用了条件编译符号,可在 Debug 模式下使用未压缩的版本以方便调试,在 Release 模式下则可自动切换至对已压缩文件的引用,并通过 Microsoft Ajax Minifier 生成最新的被压缩后的文件版本,对于程序的开发和部署均非常的方便,例如下面的代码:

 1 @{
 2     ViewBag.Title = "产品";
 3     ViewBag.AllowEdit = true;
 4     ViewBag.AdminJsUrl = YbRapidSolution.Mvc.AutofacBootStrapper.RELEASE
 5                              ? @Url.Content("~/Scripts/Admin/Products/Index.min.js")
 6                              : @Url.Content("~/Scripts/Admin/Products/Index.js");
 7     var commonJs = YbRapidSolution.Mvc.AutofacBootStrapper.RELEASE
 8                        ? @Url.Content("~/Scripts/Admin/Products/_Common.min.js")
 9                        : @Url.Content("~/Scripts/Admin/Products/_Common.js");                              
10 } 

    2、js、css文件的打包

    其目的是进行 js 文件和 css 文件的合并,当前主流浏览器的并发连接数默认情况下通常都是 6 个,如果前端页面同时请求的服务器资源(如 img 文件、js 文件、css 文件以及各类 url 请求等)超过6个,通常就需要进行排队下载。进行 js 文件、css 文件的打包合并,通常可以在一次请求中就完成未打包之前需多次请求才能完成的工作,通过减少前端浏览器的连接请求,在某种意义上也是可提高系统的响应速度的。js、css 文件的打包通常可以使用 MVC 自带的 Bundle 功能,也可使用某些专用的打包工具,具体不再详细描述。

    如需了解更多请点击:权限模型+流程专家 Demo

    附一:YbSoftwareFactory操作手册

    附二:YbSoftwareFactory底层组件帮助文档