zoukankan      html  css  js  c++  java
  • 解决ASP.NET网站发布问题

    目录

    前言

    开始

    aspx.cs文件放到单独的类库项目

    一个可选择勾选页面的发布工具: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。如图所示:

     

    开始

    来到新公司的这段时间,经常听到同事们抱怨:只是改了几个页面,每次都要将整个网站发布一遍,然后从上百个文件中仔细的挑选自己改的那几个页面。

    仔细想想,以前开发的网站都是客户定制的,网站一交付,基本就不会再修修改改了,或者根本就不发布网站,直接把源码放到IIS中,故不会频繁发布网站。

    来到新公司之后,开发的是公司自己的在线产品,经常需要对网站升级、修改,因而需频繁的发布网站。

    对需要频繁发布网站的团队来说,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

  • 相关阅读:
    Multi-Agent Actor-Critic for Mixed Cooperative-Competitive Environments环境代码详解
    zc.buildout构建项目时报错‘AttributeError: '_NamespacePath' object has no attribute 'sort'’
    利用Jenkins打包ISO和QCOW2镜像文件
    解决python pip安装提示"not a supported wheel on this platform"
    Kali 2017.3开启VNC远程桌面登录
    Jenkins邮件扩展插件Email Extension Plugin配置使用
    Jenkins执行sudo权限的设置
    如何解决源码安装软件中make时一直重复打印configure信息
    CentOS 7下安装配置proftpd搭建ftp服务器
    如何使用capedit分割数据包文件
  • 原文地址:https://www.cnblogs.com/limusic/p/3378023.html
Copyright © 2011-2022 走看看