解决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 Deployment的Updatable 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.asax成App_global.asax.dll。(不用global.asax,所有的事件方法都是在HttpModule中定义)
  4. 编译app_code成app_code.dll。web.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. aspx与cs分离了。aspx完全可以交给前端工程师,Cs交给后端工程师,分工更明确,开发效率更高。
  2. 支持单元测试。以往开发页面,想测试aspx.cs中某个方法,只能浏览页面。如果放到类库项目下,单元测试将变得很方便
  3. 网站发布时很快。编译类库项目是相当快的。如果没用到Global.asax和App_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自带的发布网站工具每次都要预编译整个网站的缺陷。那只能自己开发个插件了。

其中涉及到几个技术点:

    1. VS插件开发。推荐阅读:Visual Studio 2008 可扩展性开发
    2. asp.net 预编译。使用aspnet_comlier.exe(在目录:C:\Windows\Microsoft.NET\Framework\v4.0.30319 ) 来发布网站。推荐阅读:

      ASP.NET 编译工具

      例如:

      aspnet_compiler -p c:\website -c -v c:\PrecomplierWeb -fixednames –u

      参数说明:

      LimusicAddin 使用说明:

      1. 下载LimusicAddin压缩包
      2. 复制文件:LimusicAddin.AddIn和LimusicAddin.dll到[My documents]/VS2010/Addins下
      3. VS打开一个网站,右键—自定义发布。如下图:

ASP.NET网站单独的更多相关文章

  1. ASP.Net网站程序在编译发布部署后的后期修改

    ASP.Net网站程序在发布部署后的后期修改 作者:东篱南山 这里说的后期修改是指网站编译发布并部署好之后,对程序进行的修改,即在不能更改现有代码的情况下,更改页面的显示或是更改业务逻辑.一般是在程序 ...

  2. 26种提高ASP.NET网站访问性能的优化方法 .

    1. 数据库访问性能优化 数据库的连接和关闭 访问数据库资源需要创建连接.打开连接和关闭连接几个操作.这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源. ASP.NET中提供了连接池 ...

  3. 如何在IIS6,7中部署ASP.NET网站

    http://www.cnblogs.com/fish-li/archive/2012/02/26/2368989.html 阅读目录 开始 查看web.config文件 在IIS中创建网站 IIS6 ...

  4. 如何在IIS6,7中部署ASP.NET网站(转载)

    查看web.config文件 web.config通常会放在网站的根目录,这个文件中包含了一最重要的网站运行参数.比如: connectionStrings,httpHandlers,httpModu ...

  5. ASP.NET 网站管理工具

    ylbtech-Miscellaneos:ASP.NET 网站管理工具 1. 网站管理工具概述返回顶部 网站管理工具概述 介绍 使用网站管理工具,可以通过一个简单的 Web 界面来查看和管理网站配置. ...

  6. 提高ASP.NET网站性能的方法

    http://www.360doc.com/content/14/0705/18/7662927_392224856.shtml   Asp.NET有许多秘密,当你了解了这些秘密后,可以使得你的ASP ...

  7. 在IIS6,7中部署ASP.NET网站[转]

    阅读目录 开始 查看web.config文件 在IIS中创建网站 IIS6 添加扩展名映射 IIS6 无扩展名的映射 目录的写入权限 SQL SERVER的配置 在IIS7中部署ASP.NET程序 8 ...

  8. 在IIS6,7中部署ASP.NET网站

    查看web.config文件 ASP.NET网站与一般的桌面程序不同,不是拷贝过来就能运行的(数据库连接除外). 要想运行它,通常需要一些配置过程.但是,我们到底需要配置什么呢?答案是:查看web.c ...

  9. Jenkins持续集成(下)-Jenkins部署Asp.Net网站自动发布

    环境:Windows 2008 R2.Jenkins2.235.1.Visual Studio 2017: 概要 前面写过一篇文章,<自动发布-asp.net自动发布.IIS站点自动发布(集成S ...

随机推荐

  1. jQuery 的 serializeArray()、serialize() 方法

    serializeArray()方法说明: 实例 输出以数组形式序列化表单值的结果: $("button").click(function(){ x=$("form&qu ...

  2. 部署中遇到的问题-UWSGI(一)

    假设uwsgi错误中提示 *** no app loaded. going in full dynamic mode *** 运行 [plain] view plaincopy aptitude in ...

  3. android详细信息java.util.ConcurrentModificationException变态

    在今天做android当项目,我遇到了这个异常,好吧.其实最不寻常遇到异常IllegalstateException.它们与我们的硬件连接SDK抛出,我想折磨学生阿玉啊.扯远了. 今天,我想回到这个异 ...

  4. Python_生成測试数据

    本文出自:http://blog.csdn.net/svitter 生成1~10的随机数1000个: import random fp = open("test", 'w'); f ...

  5. java.lang.IllegalAccessError: tried to access field org.slf4j.impl.StaticLoggerBinder.SINGLETON from class org.slf4j.LoggerFactory

    java.lang.IllegalAccessError: tried to access field org.slf4j.impl.Static.. java.lang.IllegalAccessE ...

  6. JS子元素oumouseover触发父元素onmouseout

    原文:JS子元素oumouseover触发父元素onmouseout JavaScript中,父元素包含子元素: 当父级设置onmouseover及onmouseout时,鼠标从父级移入子级,则触发父 ...

  7. Android 通过网络打开自己的APP(scheme)

    通过使用手机的浏览器(内部.第三方能够)访问网页,点击一个链接,开始实施自己的应用程序,和传输数据. 第一Mainifest面对文件启动Activity添加过滤器. <activity andr ...

  8. JAVA学习篇--Java类加载

    由来: 与普通程序不同的是,Java程序(class文件)并非本地的可执行程序(解释性语言). 当执行Java程序时.首先执行JVM(Java虚拟机),然后再把Javaclass载入到JVM里头执行, ...

  9. 单元测试之Qunit

    单元测试之Qunit 前言 因为公司开发了一套javascript SDK需要测试,在网上找了很久,找到了JQuery团队开发的QUnit,和基于JUnit的JsUnit,还有一些还没有看,先讲讲QU ...

  10. SQL点滴12—SQL Server备份还原数据库中的小把戏

    原文:SQL点滴12-SQL Server备份还原数据库中的小把戏 备份数据库时出现一个不太了解的错误 ,错误信息“is formatted to support  1 media families, ...