YbSoftwareFactory 代码生成插件【二十一】:Web Api及MVC性能提升的几个小技巧

最近在进行 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底层组件帮助文档

时间: 2024-10-12 07:54:38

YbSoftwareFactory 代码生成插件【二十一】:Web Api及MVC性能提升的几个小技巧的相关文章

YbSoftwareFactory 代码生成插件【二十】:DynamicObject的序列化

DynamicObject 是 .NET 4.0以来才支持的一个类,但该类在.NET 4.0下未被标记为[Serializable] Attribute,而在.NET 4.5下则被标记了[Serializable] Attribute.需要注意的是,如果你使用需要进行XML序列化等操作(例如WCF中),部署到未安装.NET 4.5的环境中通常会报错并提示异常,而不管你编译时使用的目标平台是.NET 4.0 还是 .NET 4.5.通常这个错误在安装了.NET 4.5环境的开发机上通常没有问题,即

YbSoftwareFactory 代码生成插件【十九】:实体类配合数据库表字段进行属性扩展的小技巧

实体类通常需要和数据库表进行了ORM映射,当你需要添加新的属性时,往往同时也需要在数据库中添加相应的字段并配置好映射关系,同时可能还需对数据访问组件进行重新编译和部署才能有效.而当你开始设计一个通用数据访问组件后,因为项目需求的不同和需求的不断变化演变,很难不能保证不会再添加额外的属性和字段.特别是项目部署运行后,添加一个属性和字段带来的额外维护的工作量可能要远远超过对代码进行调整的工作量.本文提供了属性字段扩展的一种思路,在满足核心字段可通过实体类强类型进行访问的同时,还可通过C# 4.0提供

YbSoftwareFactory 代码生成插件【十八】:树形结构下的查询排序的数据库设计

树形结构的排序在中国特色下十分普遍也非常重要,例如常说的五大班子,党委>人大>政府>政协>纪委,每个班子下还有部门,岗位,人员,最终排列的顺序通常需要按权力大小.重要性等进行排列,顺序排列不好可是重大的罪过,领导很生气,后果很严重.这种排序方式本质上就是典型的树形结构深度排序,但在数据库中很难直接通过SQL语句简单高效地进行处理,更不用说还要支持不同类型数据库了. 当前解决此类问题,主要有两种方法. 1. 排序码方式 原理:在每个树形节点上均设置一个排序码,排序码通常是一个字符串并

C#开发微信门户及应用(47) - 整合Web API、微信后台管理及前端微信小程序的应用方案

在微信开发中,我一直强调需要建立一个比较统一的Web API接口体系,以便实现数据的集中化,这样我们在常规的Web业务系统,Winform业务系统.微信应用.微信小程序.APP等方面,都可以直接调用基于JSON数据格式的Web API接口,在我之前的几篇随笔中,对这方面都有一定的介绍,本篇继续这个主题,细致深入的阐述如何在接口和源码的基础上整合Web API.微信后台管理及前端微信小程序的应用方案. 1.基于Web API的微信开发框架 首先我们各个业务模块,都应该围绕着Web API进行展开,

使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(二)-- Web Api Demo

在上一篇里,我已经建立了一个简单的Web-Demo应用程序.这一篇将记录将此Demo程序改造成一个Web Api应用程序. 一.添加ASP.NET Core MVC包 1. 在project.json文件添加Microsoft.AspNetCore.Mvc包 1 { 2 "version": "1.0.0-*", 3 "buildOptions": { 4 "debugType": "portable",

Create a Web API in MVC 6

原文: http://www.asp.net/vnext/overview/aspnet-vnext/create-a-web-api-with-mvc-6 ASP.NET 5.0的一个目标是合并MVC和Web API frameworkd. 创建空白ASP.NET 5项目 打开Visual Studio 2015. 在File菜单, 选择 New > Project. 在New Project对话框中, 点击Templates > Visual C# > Web, 选择ASP.NET

YbSoftwareFactory 代码生成插件【二十五】:Razor视图中以全局方式调用后台方法输出页面代码的三种方法

上一篇介绍了 MVC中实现动态自定义路由 的实现,本篇将介绍Razor视图中以全局方式调用后台方法输出页面代码的三种方法. 框架最新的升级实现了一个页面部件功能,其实就是通过后台方法查询数据库内容,把查询结果的 HTML 代码呈现到 Razor 视图中,考虑到灵活性,需要能在任意 Razor 视图中调用该方法,这样任意 Razor 页面都能以统一的方式方便地共享该页面部件的 HTML 内容,这对于代码的重用性和可维护性都是非常有必要的. 为实现上述要求,本文介绍如下可供选择的三种方式.   1.

YbSoftwareFactory 代码生成插件【二十三】:集成强大的公文流转系统

今天有空更新博客才发现快一年没有写博客了,不得不感叹时间过得真快.过去的一年确实也挺忙的,在此祝各位博友们新的一年工作顺利.权限模型在过去一年进行了不少的升级,主要集成了公文流转系统.多家手机短信接口的集成.CMS动态路由的实现.以及Hangfire消息队列与任务调度组件的集成等,本章主要对公文流转系统进行总体的介绍,感兴趣的可进一步交流或访问http://pjdemo.yellbuy.com. 公文流转系统是国内企事业单位的普遍需求,具有很强的中国特色.通常其核心需求如下: 具备公文流程审批,

YbSoftwareFactory 代码生成插件【二十四】:MVC中实现动态自定义路由

上一篇介绍了 公文流转系统 的实现,本篇介绍下MVC下动态自定义路由的实现. 在典型的CMS系统中,通常需要为某个栏目指定个友链地址,通过指定友链地址,该栏目的地址更人性化.方便记忆,也有利用于搜索引擎优化. 但在MVC中,通常需要在应用程序启动时注册路由规则,该路由规则又通常和控制器进行了关联,也就是某个地址通常情况下都是有对应的控制器进行处理的.但在MVC中如何做到自定义动态路由,以便能在运行时通过某个控制器处理一些运行时动态设定的Url地址呢? 方法当然是有的:    1.首先实现一个动态