解決ASP.NET網站發佈問題

目錄

前言html

開始前端

aspx.cs文件放到單獨的類庫項目web

一個可選擇勾選頁面的發佈工具:LimusicAddin後端

前言

Asp.net 發佈分爲:動態編譯和預編譯。預編譯又分爲:In Place Pre-compilation Pre-compilation for Deployment。關於asp.net編譯,推薦Artech寫的:瀏覽器

深刻剖析ASP.NET的編譯原理之一:動態編譯(Dynamical Compilation)服務器

深刻剖析ASP.NET的編譯原理之二:預編譯(Precompilation)前端工程師

本文講述的編譯都是預編譯中Pre-compilation for DeploymentUpdatable Pre-compilation。如圖所示:mvc

 

開始

來到新公司的這段時間,常常聽到同事們抱怨:只是改了幾個頁面,每次都要將整個網站發佈一遍,而後從上百個文件中仔細的挑選本身改的那幾個頁面。app

仔細想一想,之前開發的網站都是客戶定製的,網站一交付,基本就不會再修修改改了,或者根本就不發佈網站,直接把源碼放到IIS中,故不會頻繁發佈網站。asp.net

來到新公司以後,開發的是公司本身的在線產品,常常須要對網站升級、修改,於是需頻繁的發佈網站。

對須要頻繁發佈網站的團隊來講,vs自帶的發佈網站工具,帶來的痛苦有:

a、每次需整個發佈一遍,特別耗時間。頁面越多,預編譯就越慢。

b、須要仔細挑出本身修改過的aspx頁面和bin下對應的dll文件。一樣是:頁面越多,越不容易找到,特別是dll

 

據說博客園博客程序中.aspx.ascx文件總共加起來有3000多個,使用fixednames編譯須要30分鐘,呵呵~~

那怎麼辦呢?

如下提供兩種解決方法:

aspx.cs文件放到單獨的類庫項目

將全部的aspx.cs文件集中放到同一類庫項目下,意味着你攬了ASP.NET預編譯的活。也就是說預編譯給每一個頁面生成的代碼,你須要本身手寫。

先來對比一下正常發佈,頁面文件內容的變化:

Web.config設置:

 

Default.aspx:

 

發佈前:

 

發佈後:

 

 

Default.aspx.cs:

 

發佈前:

 

發佈後(用.Net Reflector打開bin目錄下對應的dll:

 

因而可知,預編譯作的工做:

  1. 爲每一個頁面單獨生成一個dll,並在class中爲頁面上全部服務端空間,聲明一個以id命名的控件全局變量。(頁面中不用服務端控件,所有是原生的html開發,此可忽略)
  2. 解析web.config中的設置。例如:page節點、profile節點。(能夠用基類代替page節點設置,能夠用全局變量代替profile設置,或者寫到appsetting節點下)
  3. 編譯global.asaxApp_global.asax.dll(不用global.asax,全部的事件方法都是在HttpModule中定義)
  4. 編譯app_codeapp_code.dllweb.config中的Profile節點生成在app_code中的ProfileCommon中。(基本沒用過profile,一般使用公共靜態屬性代替)

     

Demo

  1. 打開vs,新建一個網站。
  2. 添加一個類庫項目:AspxCsCode,並添加System.Web的引用
  3. 爲網站添加類庫項目的引用。
  4. 以上述Default.aspx爲例,將Default.aspx.cs剪切到AspCsCode項目中。以下圖:
  5. 修改Default.aspx.cs代碼:

     

  6. 修改Default.aspx

     

  7. 生成網站。在瀏覽器中查看default.aspx

    點擊登陸è

     

     

總結

優勢:

  1. aspxcs分離了aspx徹底能夠交給前端工程師,Cs交給後端工程師,分工更明確,開發效率更高。
  2. 支持單元測試。以往開發頁面,想測試aspx.cs中某個方法,只能瀏覽頁面。若是放到類庫項目下,單元測試將變得很方便
  3. 網站發佈時很快。編譯類庫項目是至關快的。若是沒用到Global.asaxApp_Code的話,基本上都不須要發佈了。

缺點:

  1. 攬了ASP.NET預編譯的活。若是項目中不用服務端控件,這個基本能夠忽略
  2. 發佈的時候,有覆蓋他人頁面的風險。跟團隊成員討論,部分人以爲,把全部頁面的cs文件放到一個類庫項目中,

    當我修改了a.aspx.cs,b.aspx.cs也被別人修改時或者尚未被簽入,我沒有獲取最新版本,而後就把類庫編譯成的dll,更新到服務器上從

    而會出現問題,更偏好Asp.net預編譯生成的一個頁面對應一個dll的方式,只發布本身改的文件,將影響面積降到最低。

    我的以爲這個缺點的理由不夠充分,既然要發佈,那就必須保證你編譯的全部代碼版本不該該比服務器上的版本低,

    若是這個保證不了,那怎麼能保證頁面引用的其餘dll是最新的呢,並且若是照上述邏輯,

    asp.net mvc豈不是也有這種狀況?給每一個cs都單獨生成一個dll豈不更好?

    故而認爲,無論哪一種方式都有覆蓋他人代碼的風險,只是這種方式風險稍微大些。

    

一個可選擇勾選頁面的發佈工具:LimusicAddin

aspx.cs文件放到單獨的類庫項目實際上是一種變通的方法,本質上並無解決vs自帶的發佈網站工具每次都要預編譯整個網站的缺陷。那隻能本身開發個插件了。

詳細介紹:

可發佈指定的ASP.NET頁面的插件:LimusicAddin

 

相關文章
相關標籤/搜索