记一次ASP.NET MVC性能优化(实际项目中)

前言

在开发中为了紧赶项目进度而未去关注性能的问题,在项目逐渐稳定下来后发现性能令人感到有点忧伤,于是开始去关注这方面,本篇为记录在开发中遇到的问题并解决,不喜勿喷。注意:以下问题都是在移动端上出现,无法确定在网站中是否也同样会出现。

卡顿问题

请求方式

项目属于移动端,在手机上查看某一列表时并进行向下滑动时经常性卡顿问题,滚动的插件采用的是iscroll,当然怀疑是不是这个插件问题,但是很快就排除了这个问题,在其他页面未出现这个问题,后来接着想因为在脚本中进行Ajax请求超时时间设置为30秒,是不是有可能请求接口耗时导致的呢,经过测试并查看日志文件也不是这个问题,于是我开始查看写的脚本文件,吓我一跳,在请求获取数据列表时,请求方式居然写的POST,这是同事所为,我改为GET后这样的问题得到了大大的改善,我询问同事为什么用POST而不用GET,他说了一句进行GET请求有问题出现错误,这时我才明白他指的是什么,在MVC中在进行GET请求获取JSON数据时,需要进行如下设置:

 return Json("",JsonRequestBehavior.AllowGet);

建议:在进行Ajax请求时,是什么请求方式,请采取对应的方式来进行请求,要不然给出其他请求方式干嘛,吃饱了撑着吗!

路径问题

通过上述请求方式改善后问题得到一定的改善(评论也有指出不是这个导致快慢的问题,同意评论观点,应该是其他原因导致,还是觉得对应的请求采取对应的方式才是),但是还是存在问题,我们继续查看脚本,我们可能会经常这样做:我们将需要用到的一些脚本方法,比如格式日期转换,获取cookie等封装在一个公用脚本中来方便调用。下面我们进行演示下。

在脚本中进行请求时我们一般进行如下:

        $(function () {
                type: 'get',
                url: "/home/Info",
                data: {},
                success: function () { },
                dataType: "application/json"
            });
        });

但是同事却是这样做的,将请求路径写在公用脚本中如下:

var path = "/"

此时我们的请求就变成了这样:

       $(function () {
            $.ajax({
                type: 'get',
                url: path + "home/Info",
                data: {},
                success: function () { },
                dataType: "json"
            });
        });

这样写肯定没错,但是事实时当我们改成了第一种时效率马上提上来了,而用第二种方式时会请求很长时间,方式不同,但是貌似没什么区别,至于原因我也不明白,为什么如同事那样写不行。

建议:当进行请求时,请直接写路径而不要上述那样,有时候在你看来,方式一样,却导致了不同的结果。

至此也就大致上解决了在手机上滑动时卡顿的问题,当然也不排除脚本写的有问题的情况。

缓存问题 

在页面请求时为了那些不会改变的脚本或者数据从而加快页面加载速度,我们通常使用缓存来解决。

脚本、样式缓存

在进行请求时,有些不会改变的脚本我们需要进行缓存,而不是每请求一次而又重新加载一次,当然此时就有人想到了怎么样去缓存脚本的问题,比如如下:

 <script src="~/Scripts/video.js?2016040901"></script>

在脚本文件后加上一段数字就ok了,是的确实是这么简单,当我们对脚本文件进行了修改再去改变下后面的数字即可,但是你有没有想过,如果项目中脚本文件多的数不胜数而且一旦你修改了大量的脚本文件,你还去页面中进行大量的更改,你不累吗,反正我会累死。而我想到的是将那些一些引入的脚本在后面直接加上数字肯定是没问题,因为这样的脚本我们基本不会去动了,例如引入jquery脚本(有些人可能会钻空子了,去修改也是有可能的),好吧,那我们统一一点诺:我们在配置文件中可以将其后面的数字作为我们去要修改的脚本,当我们修改了脚本直接改变配置文件中的版本不就得了,这样方便管理,一劳永逸,何乐而不为。我们下面来看看。

(1)我们在配置文件中添加修改的脚本版本(当然你可以随便写一串数字,下次修改了脚本直接改变其数字即可)

  <add key="version" value="2016040901"/>

(2)接着我们写一个HtmlHelper的扩展方法,如下:

    public static class FileHtmlHelper
    {
        private static readonly string s_version = ConfigurationManager.AppSettings["version"].ToString();
        private static readonly string s_root = HttpRuntime.AppDomainAppPath.TrimEnd('\\');
        public static MvcHtmlString RefFileHtml(this HtmlHelper htmlHelper, string path)
        {

            string filePath = s_root + path.Replace("/", "\\");
            return new MvcHtmlString(string.Format("<script type=\"text/javascript\" src=\"{0}?{1}\"></script>\r\n", path, s_version));
        }
    }

(3)此时我们在MVC视图页面进行如下调用脚本:

  @Html.RefFileHtml("/Scripts/video.js")

这样我们就解决了脚本缓存以及方便管理的问题。

建议:在进行脚本缓存为了方便管理可以通过配置文件读取修改的版本进行管理脚本文件的缓存。样式缓存也是如此。

页面输出缓存 

在MVC中我们可以对Action缓存,如下:

        [OutputCache(Duration = 30)]
        public ActionResult Cache()
        {
            return View();
        }

那要是当我们有参数来达到缓存时,又该如何做呢?直接对整个页面所有请求的参数进行缓存,如下:

        [OutputCache(Duration = 30,VaryByParam="*")]
        public ActionResult Cache()
        {
            return View();
        }

此上对JsonResult也是如此,当我们通过参数来筛选不变的列表时,此时我们完全可以将其进行缓存,此时我们明确的参数类型也就是自定义缓存。

我们通过配置文件来进行配置即可,如下:

     <caching>
      <outputCacheSettings>
        <outputCacheProfiles>
          <add name="customProfile" duration="900" location="Server" varyByParam="UserId" />
        </outputCacheProfiles>
      </outputCacheSettings>
    </caching>

在上述还有许多参数供你选择,选择你需要的缓存参数即可。

在控制器中我们只需添加自定义缓存名称即可:

        [OutputCache(CacheProfile="customProfile"]
        public JsonResult Info()
        {
            return Json(new { result = "ok" }, JsonRequestBehavior.AllowGet);
        }

注意:上述caching节点是位于system.Web节点下,而非system.webServer节点下。

配置文件修改以及其他

(1)删除不需要的httpModules,如下:

<httpModules>
    <remove name="Session"/>
    <remove name="RoleManager"/>
    <remove name="PassportAuthentication"/>
    <remove name="Profile"/>
    <remove name="ServiceModel"/>
</httpModules>

(2)由于利用表单验证,也可以删除如下httpModules

<httpModules>
    <remove name="WindowsAuthentication"/>
    <remove name="FileAuthorization"/>
</httpModules>

(3)在IIS上启用压缩,压缩响应结果减少网络传输时间。

苹果日期问题注意

当数据进行数据库存储时发现在安卓上存储成功,而在苹果上存储失败,这个问题纠结了很久,并查看日志文件最终发现苹果上对日期有特殊的格式传递,否则为空,于是利用js中的replace方法来进行替换。

 date.replace("-", "/");

此时发现利用replace方法只能替换第一个横线,最终采用正则表达式全部替换并解决

 date.replace(/-/g, "/");

注意:在苹果上日期进行传递时必须是如"2016/04/09"而不能为"2016-04-09"。

结语

部分参考来源:不修改代码就能优化ASP.NET网站性能的一些方法

通过对问题的出现以及解决花费了一点时间,最终使得在手机上请求数据耗时得到大大的改善、页面加载的速度提高了许多以及滑动数据顺畅而由此告一段落。有些细小的问题平时不太注意,感觉各种方式都能实现,殊不知这样做的结果是否是一样,实现的结果一样,但是呈现出的效果却是天壤之别,实际开发中发现一些小的细节对整个项目的成败是多么的重要。

检讨:对于文中评论观点持认同,第一个对于请求方式这块应该是其他原因所导致,第二个对于协议这块确实需要更深入的了解和学习,感谢评论中的精彩回答,涨知识了,在此一并表示感谢。 

时间: 2024-08-25 11:18:58

记一次ASP.NET MVC性能优化(实际项目中)的相关文章

ASP.NET程序性能优化五则

asp.net|程序|性能|优化 一.使用存储过程: 1.性能方面:存储过程提供了许多标准sql语言中所没有的高级特性.其传递参数和执行逻辑表达式的功能,有助于应用程序设计者处理复杂任务.另外,存储过程存储在本地服务器上,减少了执行该过程所需的网络传输宽带和执行时间.(存储过程已经对sql语句进行了预编译,所以其执行速度比在程序里执行sql语句快很多) 2.程序结构方面:从程序的可扩展性看,使用存储过程会对程序以后的修改带来方便.比如数据库的结构改变了,只需修改相对应的存储结构,和程序中的调用部

为ASP.NET MVC RC分离Controllers-Views项目后添加“脚手架”功能(二)

上一篇<为ASP.NET MVC RC分离Controllers-Views项目后添加"脚手架"功能(一)> 中讲到如何 分离Controllers和Views项目,并且为Controllers项目添加MVC RC的"脚手架",可惜"脚手架"的功 能保留的过于完整,以至于自动创建和察看View页面都会在当前项目中进行,除非你心甘情愿每次创建完 成后手动将文件转移到Views(Web)项目,否则这个"脚手架"的意义几

MVC模式在j2me项目中的应用(一)

项目 MVC模式在j2me项目中的应用(一)作者:FavoYang Email:favoyang@yahoo.com 欢迎交流Keywords:MVC j2me UI模式 内容提要:本文简要的介绍了MVC模式的思想,并分析了MVC模式的利弊,最后结合MIDP平台给出几种常见的MVC模式实践.相信此文对任何一个使用midp平台的商务程序开发者都或多或少的有所帮助. 版权声明:本文同时发表在www.j2medev.com和我的Blog(blog.csdn.net/alikeboy)上,如果需要转载,

MVC模式在j2me项目中的应用(二)

项目 MVC模式在j2me项目中的应用(二)作者:FavoYang Email:favoyang@yahoo.com 欢迎交流Keywords:MVC 案例 模式 内容提要:如果想试验一下自己对一个知识到底有几分的掌握,最好的方法就是实践她.结合一个名为"NOTE"的项目(记事本),运用MVC模式进行构建,一起体会一下MVC的强大与灵活.请注意的是,本文中关于不再使用MVC这样的术语,而是使用边界类.控制类.实体类.生命周期类这样的称呼.关于MVC的在j2me上的种种变化请看本文的(一

ASP程序的性能优化

程序|性能|优化 第一章 使用服务器缓存 1.使用application和session保存数据的技巧. 可以再程序启动或会话开始时将需要的数据赋值给application和session对象.使用这种方法只需要在global.asa文件的application_Onstart和session_OnStart函数中添加响应的赋值函数或语句即可. 再合适的条件下可以缓存ADO记录本身,但是需要注意: 1.ADO记录必须时自由线程标记的 2.必须时已经断开的记录集 3..在服务器硬盘上缓存数据 对于

asp.net的性能优化

asp.net|性能|优化 性能对于一个应用程序来说是一个很重要的问题,在web的开发中也是一样,相信没有人愿意在电脑屏幕前花8秒钟来等待一个也面的打开,这就是常说的在web上的8秒钟原则.对于一个应用程序的性能我们应该把它当作是应用程序的一项功能,在设计的时候就应该处理好性能的问题,而不应该在整个程序开发完了以后再来进行优化,因为这样会付出更多的代价.下面来讨论一下在asp.net中的性能问题.    asp.net相对于以前的版本asp通过引擎的改变,从而提高了性能.Asp是一种脚本解释引擎

个人ASP.NET程序性能优化心得(1):数据库篇

前言 相信园子里有不少程序员同学都是在做着xx管理系统这样的中小型项目,这种项目往往是一种工作量的代码,程序员同学就将青年耗费在这样的项目中,不断改变需求,不断地加班赶工,于是就开始怀疑这个行业,对developer充满厌恶,想学新东西,可是周围同事的水平都是差不多:想买书学平时加班根本没有自己的时间.这种状况相信大多数情况都在我们身边发生,我之前就是处于这种状态,使用的是asp.net语言,不过很难界定所做的项目是网站还是软件,因为它很复杂,开发周期和传统软件开发没有什么区别,但它确实是部署在

Asp.net 网站性能优化二则分享_实用技巧

随着后端优化空间越来越小,现在越来越多的网站更注重前端性能的优化,就是浏览器,http层面的优化,这里写两点最简单最有效的 asp.net网站优化技巧. 了解常见的网站性能优化技巧 首先我们要学一些优化网站性能和体验的理论和基础知识,雅虎已经帮我们总结好了,详见参考链接中的几篇文章,有好心人已经给翻译成中文了.这里面提到的一些技巧可操作性都很强,建议每一个网站开发人员都仔细学习并进行实践,可以说不了解这里面说的优化技巧,提升网站前端性能就无从谈起. 诊断网站性能 要想优化网站的前端性能,首先要查

一起谈.NET技术,如何对ASP.NET进行性能优化

一.SqlDataRead和Dataset的选择 Sqldataread优点:读取数据非常快.如果对返回的数据不需做大量处理的情况下,建议使用SqlDataReader,其性能要比datset好很多.缺点:直到数据读完才可close掉于数据库的连接. (SqlDataReader 读数据是快速向前的.SqlDataReader 类提供了一种读取从 SQL Server 数据库检索的只进数据流的方法.它使用 SQL Server 的本机网络数据传输格式从数据库连接直接读取数据.DataReader