記一次ASP.NET MVC性能優化(實際項目中)

前言

在開發中爲了緊趕項目進度而未去關注性能的問題,在項目逐漸穩定下來後發現性能使人感到有點憂傷,因而開始去關注這方面,本篇爲記錄在開發中遇到的問題並解決,不喜勿噴。注意:如下問題都是在移動端上出現,沒法肯定在網站中是否也一樣會出現。javascript

卡頓問題

請求方式

項目屬於移動端,在手機上查看某一列表時並進行向下滑動時常常性卡頓問題,滾動的插件採用的是iscroll,固然懷疑是否是這個插件問題,可是很快就排除了這個問題,在其餘頁面未出現這個問題,後來接着想由於在腳本中進行Ajax請求超時時間設置爲30秒,是否是有可能請求接口耗時致使的呢,通過測試並查看日誌文件也不是這個問題,因而我開始查看寫的腳本文件,嚇我一跳,在請求獲取數據列表時,請求方式竟然寫的POST,這是同事所爲,我改成GET後這樣的問題獲得了大大的改善,我詢問同事爲何用POST而不用GET,他說了一句進行GET請求有問題出現錯誤,這時我才明白他指的是什麼,在MVC中在進行GET請求獲取JSON數據時,須要進行以下設置:html

 return Json("",JsonRequestBehavior.AllowGet);

建議:在進行Ajax請求時,是什麼請求方式,請採起對應的方式來進行請求,要否則給出其餘請求方式幹嗎,吃飽了撐着嗎!java

路徑問題

經過上述請求方式改善後問題獲得必定的改善(評論也有指出不是這個致使快慢的問題,贊成評論觀點,應該是其餘緣由致使,仍是以爲對應的請求採起對應的方式纔是),可是仍是存在問題,咱們繼續查看腳本,咱們可能會常常這樣作:咱們將須要用到的一些腳本方法,好比格式日期轉換,獲取cookie等封裝在一個公用腳本中來方便調用。下面咱們進行演示下。jquery

在腳本中進行請求時咱們通常進行以下:web

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

可是同事倒是這樣作的,將請求路徑寫在公用腳本中以下:ajax

var path = "/"

此時咱們的請求就變成了這樣:正則表達式

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

這樣寫確定沒錯,可是事實時當咱們改爲了第一種時效率立刻提上來了,而用第二種方式時會請求很長時間,方式不一樣,可是貌似沒什麼區別,至於緣由我也不明白,爲何如同事那樣寫不行。數據庫

建議:當進行請求時,請直接寫路徑而不要上述那樣,有時候在你看來,方式同樣,卻致使了不一樣的結果。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網站性能的一些方法

經過對問題的出現以及解決花費了一點時間,最終使得在手機上請求數據耗時獲得大大的改善、頁面加載的速度提升了許多以及滑動數據順暢而由此告一段落。有些細小的問題平時不太注意,感受各類方式都能實現,卻不知這樣作的結果是不是同樣,實現的結果同樣,可是呈現出的效果倒是天壤之別,實際開發中發現一些小的細節對整個項目的成敗是多麼的重要。

反省:對於文中評論觀點持認同,第一個對於請求方式這塊應該是其餘緣由所致使,第二個對於協議這塊確實須要更深刻的瞭解和學習,感謝評論中的精彩回答,漲知識了,在此一併表示感謝。 

相關文章
相關標籤/搜索