天天看點

21、ASP.NET MVC入門到精通——ASP.NET MVC4優化

本系列目錄:ASP.NET MVC4入門到精通系列目錄彙總

删除無用的視圖引擎

預設情況下,ASP.NET MVCE同時支援WebForm和Razor引擎,而我們通常在同一個項目中隻用到了一種視圖引擎,如Razor,那麼,我們就可以移除掉沒有使用的視圖引擎,提高View視圖的檢索效率。在沒有删除WebForm引擎之前,檢索控制器中不存在的視圖時,我們可以從下圖看到,檢索視圖的順序是先Home目錄下面,然後Shared目錄下面的aspx、ascx檔案。

21、ASP.NET MVC入門到精通——ASP.NET MVC4優化

1、在Global.asax中添加如下代碼:

void RemoveWebFormEngines()
        {
            var viewEngines = ViewEngines.Engines;
            var webFormEngines = viewEngines.OfType<WebFormViewEngine>().FirstOrDefault();
            if (webFormEngines != null)
            {
                viewEngines.Remove(webFormEngines);
            }
        }

 protected void Application_Start()
        {
            RemoveWebFormEngines(); //移除WebForm視圖引擎
            AreaRegistration.RegisterAllAreas();

            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            AuthConfig.RegisterAuth();
        }      

現在再看下

壓縮合并Css和Js

在APS.NET MVC4中,App_Start檔案夾下面多了一個BundleConfig.cs類,專門用于壓縮合并檔案的,預設情況下壓縮合并功能是開啟的,當然我們也可以使用 BundleTable.EnableOptimizations = true;來顯示設定開啟。

但是,注意要在Web.config中将 調試設定為false,壓縮才會生效  <compilation debug="false" targetFramework="4.5" />

bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
                        "~/Scripts/jquery.min.js", "~/Scripts/jquery.easyui.min.js"));// "~/Scripts/jquery-{version}.js",
 bundles.Add(new StyleBundle("~/Content/css").Include("~/Content/themes/default/easyui.css", "~/Content/themes/icon.css"));//"~/Content/site.css",      

我們來看下壓縮合并前和壓縮合并後的對比

壓縮合并前:

21、ASP.NET MVC入門到精通——ASP.NET MVC4優化
21、ASP.NET MVC入門到精通——ASP.NET MVC4優化

壓縮合并後

21、ASP.NET MVC入門到精通——ASP.NET MVC4優化
21、ASP.NET MVC入門到精通——ASP.NET MVC4優化

很明顯,我們看到檔案被合并了,減少了網絡請求數,同時,檔案的大小也減小了,說明被壓縮處理了。

注意:我們隻能合并同一類型的檔案,也就是說不能把js和css檔案合并到一起,隻能單獨合并js檔案和css檔案。

使用防僞造令牌來避免CSRF攻擊

對表達送出來說,要關注的就是安全問題。ASP.NET MVC提供了探測某種攻擊類型的機制,其中一種措施就是防僞造令牌。這種令牌包含伺服器端和用戶端元件,代碼會在表單中插入一個隐藏域以儲存使用者特定的令牌 @Html.AntiForgeryToken()

@using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl })) {
    @Html.AntiForgeryToken()      

注意:@Html.AntiForgeryToken()隻能添加在Html.BeginForm()形式申明的表單中,純HTML的<form>标簽表單是不行的。

Html.AntiForgeryToken輔助方法會寫入一個加密過的資料到使用者端浏覽器的Cookie裡,然後在表單内插入一個名為_RequestVerificationToken的隐藏字段,該隐藏字段的内容,每次重新整理頁面都會不一樣,每次執行Action動作方法時,都會讓這個隐藏字段的值與Cookie的加密資料進行驗證比對,符合驗證才允許執行這個Action方法。

而且伺服器端會優先在資料處理之前執行這些令牌驗證代碼,如下:[ValidateAntiForgeryToken]

[HttpPost]
        [AllowAnonymous]
        [ValidateAntiForgeryToken]
        public ActionResult Login(LoginModel model, string returnUrl)
        {
            if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
            {
                return RedirectToLocal(returnUrl);
            }

            // 如果我們進行到這一步時某個地方出錯,則重新顯示表單
            ModelState.AddModelError("", "提供的使用者名或密碼不正确。");
            return View(model);
        }      

 隐藏ASP.NET MVC版本

預設情況下,ASP.NET MVC網站會把版本号提供給浏覽器,

21、ASP.NET MVC入門到精通——ASP.NET MVC4優化

在Global.asax中添加   MvcHandler.DisableMvcResponseHeader = true;

protected void Application_Start()
        {
            MvcHandler.DisableMvcResponseHeader = true;
            AreaRegistration.RegisterAllAreas();

            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }      

判斷用戶端請求是否為Ajax:Request.IsAjaxRequest

部落格位址: http://www.cnblogs.com/jiekzou/
部落格版權:

本文以學習、研究和分享為主,歡迎轉載,但必須在文章頁面明顯位置給出原文連接配接。

如果文中有不妥或者錯誤的地方還望高手的你指出,以免誤人子弟。如果覺得本文對你有所幫助不如【推薦】一下!如果你有更好的建議,不如留言一起讨論,共同進步!

再次感謝您耐心的讀完本篇文章。

其它:

.net-QQ群4:612347965

java-QQ群:805741535

H5-QQ群:773766020

我的拙作《ASP.NET MVC企業級實戰》《H5+移動應用實戰開發》

《Vue.js 2.x實踐指南》

《JavaScript實用教程 》

《Node+MongoDB+React 項目實戰開發》

已經出版,希望大家多多支援!

21、ASP.NET MVC入門到精通——ASP.NET MVC4優化