解决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. ASP.NET MVC+EF框架+EasyUI实现权限管理系列之开篇

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列之开篇 前言:博客又有一段时间没有更新了,心里感觉这段时间空空的,好像什么都没有学下,所以就想写博客,所以就有了这个系列,这里当然也 ...

  2. java_Eclipse主题颜色配置+全屏

    http://www.eclipsecolorthemes.org/ 这个是主题的网站. 在Eclipse里, File->Import->General->Preferences- ...

  3. vim添加自己//解决方案

    使用vim从外面将代码复制并粘贴到时间,假设有一排//凝视.自己主动下一行加入//和每行增加一个<tab>.格全乱:其他编辑器*.c *cpp其他文件格当公式,假设有一排//凝视,按o换行 ...

  4. Jenkins master在windows

    Jenkins master在windows上安装 1 Jenkins Jenkins由以前的hudson更名而来.Jenkins的主要功能是监视重复工作的执行,例如软件工程的构建或在cron下设置的 ...

  5. LeetCode: Best Time to Buy and Sell Stock II [122]

    [题目] Say you have an array for which the ith element is the price of a given stock on day i. Design ...

  6. 如何监控第三方应用程序(SOAP or RESTful client)访问HTTPS当数据站点?

    随着越来越多的互联网应用,在我们日常的开发和调试,其中(例如,调试SOAP和RESTFul什么时候),我们经常需要访问工具,通过第三方获取HTTPS网站.为了简化叙述说明,如本文所用,IE浏览器访问G ...

  7. C#中使用ref 和 out 的一点认识

    ref 通常我们向方法中传递的是值,方法获得的是这些值的一个拷贝,然后使用这些拷贝,当方法运行完毕后,这些拷贝将被丢弃,而原来的值不会受到影响. 这种情况是通常的,当然还有另外一种情况,我们向方法传递 ...

  8. href 做导航 特效

    <div> <div> <%for (int i = 0; i < 200; i++) { %><%=i.ToString() %> <br ...

  9. MVC创建XML,并实现增删改

    原文:MVC创建XML,并实现增删改 如果创建如下的XML: <?xml version="1.0" encoding="utf-8" standalon ...

  10. ubuntu eclipse android搭建

    1.eclipse加入android adt: 终端:sudo gedit /etc/hosts 加入: #for android 173.194.72.93 dl.google.com 173.19 ...