ASP.NET网站单独
解决ASP.NET网站单独发布指定页面问题
目录
前提
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):
由此可见,预编译做的工作:
- 为每个页面单独生成一个dll,并在class中为页面上所有服务端空间,声明一个以id命名的控件全局变量。(页面中不用服务端控件,全部是原生的html开发,此可忽略)
- 解析web.config中的设置。例如:page节点、profile节点。(可以用基类代替page节点设置,可以用全局变量代替profile设置,或者写到appsetting节点下)
- 编译global.asax成App_global.asax.dll。(不用global.asax,所有的事件方法都是在HttpModule中定义)
- 编译app_code成app_code.dll。web.config中的Profile节点生成在app_code中的ProfileCommon中。(基本没用过profile,通常使用公共静态属性代替)
Demo:
- 打开vs,新建一个网站。
- 添加一个类库项目:AspxCsCode,并添加System.Web的引用
- 为网站添加类库项目的引用。
- 以上述Default.aspx为例,将Default.aspx.cs剪切到AspCsCode项目中。如下图:
- 修改Default.aspx.cs代码:
- 修改Default.aspx
- 生成网站。在浏览器中查看default.aspx
点击登录è
总结
优点:
- aspx与cs分离了。aspx完全可以交给前端工程师,Cs交给后端工程师,分工更明确,开发效率更高。
- 支持单元测试。以往开发页面,想测试aspx.cs中某个方法,只能浏览页面。如果放到类库项目下,单元测试将变得很方便
- 网站发布时很快。编译类库项目是相当快的。如果没用到Global.asax和App_Code的话,基本上都不需要发布了。
缺点:
- 揽了ASP.NET预编译的活。如果项目中不用服务端控件,这个基本可以忽略
- 发布的时候,有覆盖他人页面的风险。跟团队成员讨论,部分人觉得,把所有页面的cs文件放到一个类库项目中,
当我修改了a.aspx.cs,b.aspx.cs也被别人修改时或者还没有被签入,我没有获取最新版本,然后就把类库编译成的dll,更新到服务器上从
而会出现问题,更偏好Asp.net预编译生成的一个页面对应一个dll的方式,只发布自己改的文件,将影响面积降到最低。
个人觉得这个缺点的理由不够充分,既然要发布,那就必须保证你编译的所有代码版本不应该比服务器上的版本低,
如果这个保证不了,那怎么能保证页面引用的其他dll是最新的呢,而且如果照上述逻辑,
asp.net mvc岂不是也有这种情况?给每个cs都单独生成一个dll岂不更好?
故而认为,不管哪种方式都有覆盖他人代码的风险,只是这种方式风险稍微大些。
一个可选择勾选页面的发布工具:LimusicAddin
aspx.cs文件放到单独的类库项目 其实是一种变通的方法,本质上并没有解决vs自带的发布网站工具每次都要预编译整个网站的缺陷。那只能自己开发个插件了。
其中涉及到几个技术点:
- VS插件开发。推荐阅读:Visual Studio 2008 可扩展性开发
- asp.net 预编译。使用aspnet_comlier.exe(在目录:C:\Windows\Microsoft.NET\Framework\v4.0.30319 ) 来发布网站。推荐阅读:
例如:
aspnet_compiler -p c:\website -c -v c:\PrecomplierWeb -fixednames –u
参数说明:
LimusicAddin 使用说明:
- 下载LimusicAddin压缩包。
- 复制文件:LimusicAddin.AddIn和LimusicAddin.dll到[My documents]/VS2010/Addins下
- VS打开一个网站,右键—自定义发布。如下图:
ASP.NET网站单独的更多相关文章
- ASP.Net网站程序在编译发布部署后的后期修改
ASP.Net网站程序在发布部署后的后期修改 作者:东篱南山 这里说的后期修改是指网站编译发布并部署好之后,对程序进行的修改,即在不能更改现有代码的情况下,更改页面的显示或是更改业务逻辑.一般是在程序 ...
- 26种提高ASP.NET网站访问性能的优化方法 .
1. 数据库访问性能优化 数据库的连接和关闭 访问数据库资源需要创建连接.打开连接和关闭连接几个操作.这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源. ASP.NET中提供了连接池 ...
- 如何在IIS6,7中部署ASP.NET网站
http://www.cnblogs.com/fish-li/archive/2012/02/26/2368989.html 阅读目录 开始 查看web.config文件 在IIS中创建网站 IIS6 ...
- 如何在IIS6,7中部署ASP.NET网站(转载)
查看web.config文件 web.config通常会放在网站的根目录,这个文件中包含了一最重要的网站运行参数.比如: connectionStrings,httpHandlers,httpModu ...
- ASP.NET 网站管理工具
ylbtech-Miscellaneos:ASP.NET 网站管理工具 1. 网站管理工具概述返回顶部 网站管理工具概述 介绍 使用网站管理工具,可以通过一个简单的 Web 界面来查看和管理网站配置. ...
- 提高ASP.NET网站性能的方法
http://www.360doc.com/content/14/0705/18/7662927_392224856.shtml Asp.NET有许多秘密,当你了解了这些秘密后,可以使得你的ASP ...
- 在IIS6,7中部署ASP.NET网站[转]
阅读目录 开始 查看web.config文件 在IIS中创建网站 IIS6 添加扩展名映射 IIS6 无扩展名的映射 目录的写入权限 SQL SERVER的配置 在IIS7中部署ASP.NET程序 8 ...
- 在IIS6,7中部署ASP.NET网站
查看web.config文件 ASP.NET网站与一般的桌面程序不同,不是拷贝过来就能运行的(数据库连接除外). 要想运行它,通常需要一些配置过程.但是,我们到底需要配置什么呢?答案是:查看web.c ...
- Jenkins持续集成(下)-Jenkins部署Asp.Net网站自动发布
环境:Windows 2008 R2.Jenkins2.235.1.Visual Studio 2017: 概要 前面写过一篇文章,<自动发布-asp.net自动发布.IIS站点自动发布(集成S ...
随机推荐
- OJ提交题目中的语言选项里G++与C++的区别(转载)
原文链接:http://blog.polossk.com/201405/c-plus-plus-g-plus-plus G++? 首先更正一个概念,C++是一门计算机编程语言,G++不是语言,是一款编 ...
- WebAPI 和 WebService的区别
webapi用的是http协议,webservice用的是soap协议 webapi无状态,相对webservice更轻量级.webapi支持如get,post等http操作 http soap关系 ...
- hdu Max Sum Plus Plus(dp+滚动数组)
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1024 m为段,要深刻理解题意,并没有说是段与段要连接. 题解链接:http://blog.csdn.n ...
- c/c++和java达到swap不同功能
首先我们来看看c/c++实施swap性能 void swap ( int & a, int & b) { int Temp; temp = a; a = b; b = temp; } ...
- XP 多国语言包
http://download.microsoft.com/download/f/6/4/f648c363-6975-470c-8202-ac5aea706109/WindowsXP-KB835935 ...
- Linux-常用命令1---对文件进行查看、复制、移动和分割
基于Linux的操作系统是一种自由和开放源代码的类UNIX操作系统. Linux的几大特点决定了它的不可代替和无法超越性: (1)免费的/开源的:(2)支持多线程/多用户: (3)安全性好; (4)对 ...
- 使用微软 URL Rewrite Module 开启IIS伪静态
原文 使用微软 URL Rewrite Module 开启IIS伪静态 在IIS5和IIS6时代,我们使用URL REWRITING可实现URL重写,使得WEB程序实现伪静态,但默认情况下只能实现.A ...
- 图数据库 Titan 高速入门
尤其在互联网世界,图计算越来越受到人们的关注,而图计算相关的软件也越来越丰富.本文将高速展示 Titan这个open source 的图数据库. 注:本文的操作主要基于Titan 官方的两篇文档: - ...
- JS时间戳比较大小:对于一组时间戳(开始时间~结束时间)和另一组时间戳进行比较,用于判断被比较时间戳组是否在要求范围内
/* *JS时间戳比较大小:对于一组时间戳(开始时间~结束时间)和另一组时间戳进行比较,用于判断被比较时间戳组是否在要求范围内 *@param date1 date2(形如:'2015-01-01'类 ...
- 假如我来架构12306网站---文章来自csdn(Jackxin Xu IT技术专栏)
(一)概论 序言: 此文的撰写始于国庆期间,当中由于工作过于繁忙而不断终止撰写,最近在设计另一个电商平台时再次萌发了完善此文并且发布此文的想法,期望自己的绵薄之力能够给予各位同行一些火花,共同推进国 ...