解决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

 

相关文章
相关标签/搜索