微软ASP.NET站点部署指南(3):使用Web.Config文件的Transformations

1. 综述

大多数程序里都会在Web.config里设置参数,并且在部署的时候需要更改。每次都手工更改这些配置很乏味,也容易出错。该章节将会告诉你如果通过自动化更新Web.config文件来避免这些问题。

2. Web.config Transformations 与Web Deploy Parameters

有2种方式来自动化更新Web.config文件的设置:Web.config transformations和Web Deploy parameters。Web.config transformation文件包含部署时需要更新的XML标记 。你可以为不同的build配置声明不同的更新。默认的build配置是Debug和Release,你也可以创建自定义的build配置。

 

Web Deploy parameters可以定义部署时需要更的任何设置(只要Web.config里能定义的)。定义Web.config文件更新的时候,创建Web Deploy parameters十分复杂,但是如果你只有在部署的时候才知道这些配置值的话,它是非常有用的。例如,在一些企业环境里,你将程序打包以后发给IT部门的人去安装到生产环境,IT的人需要输入字符串连接或者不能让你的密码。

该章节的内容,任何东西你都可以事先在Web.config里配置好,所以不需要使用Web Deploy parameters的方式。

提醒:如果根据本章节所做的操作出现错误信息或一些功能不正常的话,请务必check Troubleshooting页面。

3. 创建新的Build Configuration

你有2个需要部署的目标:测试环境和生产环境。部署到测试环境的话一般都是部署Release版本而非Debug版本,但是有些Web.config的参数可能和生产环境里的不一样。因为Web.config transformations是由build配置来声明的,所以你需要创建一个新的test环境使用的build配置。

 

生产环境使用默认的Release build配置,测试环境如果你能用debug的话也可以使用默认的Debug build配置。如果需要在测试环境部署Release版本的程序的话,你可以创建一个Test build配置。

打开Visual Studio Build菜单,选择Configuration Manager弹出Configuration Manager对话框。

 

Active solution configuration框里,选择新建New。弹出New Solution Configuration对话框,输入"Test"作为新build配置的名称,然后选择从Release复制设置。保存Create new project configurations选中,然后点击OK

 

关闭Configuration Manager对话框。

还需要一个Web.config transform文件来对应Test build配置。在Solution Explorer里,展开Web.config 文件可以看到默认创建的Web.Debug.configWeb.Release.config文件,右键Web.config 然后选择Add Config Transforms

 

Web.Test.config文件添加成功。

 

现在,你可以输入Web.config transformations到Web.config transformation文件了。

4. 防止Entity Framework Code First删除生产环境数据库

在开发环境,Entity Framework Code First通常默认配置成当data model改变的时候自动删除/重建数据库。在你开发站点和频繁改变data model的时候非常方便,但是你肯定不想它发生在生产环境。控制Entity Framework 自动初始化数据库的功能的推荐方法是:在Web.config 文件里设置appSettings值。

 

(早期的Code First教程建议在Global.asax文件的Application_Start方法里设置代码,如果你有这样的代码,部署之前删除它。因为不需要改变项目就可以控制Code First行为,例如,你可以配置一个测试项目来做数据库初始化。)

Web.config文件的appSettings 里设置了一个DatabaseInitializerForType

<appSettings>
<add key="DatabaseInitializerForType ContosoUniversity.DAL.SchoolContext, ContosoUniversity.DAL"
value
="ContosoUniversity.DAL.SchoolInitializer ContosoUniversity.DAL"/>
<!-- Other settings -->
</appSettings>

 

你需要为部署站点的配置修改value的属性值为"Disabled",如下:

<appSettings>
<add key="DatabaseInitializerForType ContosoUniversity.DAL.SchoolContext, ContosoUniversity.DAL"
value
="Disabled"/>
<!-- Other settings -->
</appSettings>

 

打开Web.Release.config立即添加一个新的appSettings元素,如下(确保只添加appSettings元素)。

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<appSettings>
<add key="DatabaseInitializerForType ContosoUniversity.DAL.SchoolContext, ContosoUniversity.DAL"
value
="Disabled" xdt:Transform="SetAttributes" xdt:Locator="Match(key)"/>
</appSettings>
<!-- Existing comments and system.web element -->
</configuration>

 

xdt:Transform属性值"SetAttributes" 的意思是当前transform的目的是更新Web.config文件已经存在的元素。xdt:Locator属性值"Match(key)"的意思是需要更新的元素的key属性和当前声明的key属性是一样的,另外一个value的值才是需要在部署Web.config 文件里修改的值。这段代码将会让Entity Framework Code First初始化器设置为"Disabled"。

 

如果测试环境和生产环境都使用一样的配置,也就是只能开发环境自动创建数据库,因此你需要在Web.Test.config文件添加同样的代码。(不需要更新Web.Debug.config文件,因为该章节不会创建任何Debug build)。

5. 限制错误日志访问(只授权给Administrators)

如果程序运行的时候又错误,程序会显示一个普通的错误信息(代替系统黄页),使用Elmah NuGet包来处理错误日志记录和报表。 Web.config文件的customErrors 元素声明了错误页地址:

<customErrors mode="RemoteOnly" defaultRedirect="/GenericErrorPage.aspx">
<error statusCode="404" redirect="/GenericErrorPage.aspx"/>
</customErrors>

 

要看该错误页面,可以临时设置customErrors元素的mode值为"On"然后从Visual Studio里运行程序。输入非法的URL地址(例如Studentsxxx.aspx),你可以看到替代"page not found" 错误页面的自定义错误页GenericErrorPage.aspx页面。

 

查看错误日志,在端口后面输入elmah.axd(截图的例子是:http://localhost:51130/elmah.axd)就可以访问:

 

看完以后,不要忘记把customErrors元素的mode值重新设置为"RemoteOnly" 。

 

开发环境可以任意访问错误日志页面,但生产环境可能是个安全风险,对于生产环境你可以通过在Web.Release.config文件里使用一个添transform来限制认证只有administrators才可以访问。

打开Web.Release.config,在appSettings元素后面添加下面的代码:

<location path="elmah.axd" xdt:Transform="Insert">
<system.web>
<authorization>
<allow roles="Administrator"/>
<deny users="*"/>
</authorization>
</system.web>
</location>

 

xdt:Transform属性值"Insert"的意思是添加该元素到Web.config的其他同类型节点下面作为兄弟节点。(已经有一个location元素来声明Update Credits页面验证规则了。),生产环境部署以后,你需要测试该验证是否有效。

你不需要限制测试环境的错误日志访问权限,所部需要设置Web.Test.config文件。

安全备注:任何时候都不应该在生产环境显示和保持错误日志信息,黑客可能会利用站点的漏洞还获取这些信息。如果你使用ELMAH,确保配置成最小风险。该演示里的ELMAH配置不能被认为是一个推荐配置。它只是一个例子方便我们展示如何控制一个文件夹的权限。

6. 设置环境标示符

常见的常见是不同的环境使用不同的配置,例如,一个程序调用WCF,那不同的环境可能调用的endpoint地址不一样。Contoso University程序也有类似的。设置一个站点标示符有助于用户可以很方便的知道当前你在访问哪个环境的站点。Site.Master 模板文件里会显示附件了标示符(Dev或Test)的head标题。

 

生产环境运行的时候,标示符将被禁掉。

Contoso University程序页面读取Web.config文件里的appSettings的一个值来决定当前运行的程序是哪个环境:

<appSettings>
<!-- Entity Framework initializer setting -->
<add key="Environment" value="Dev"/>
</appSettings>

 

这个value值在测试环境应该是“Test”,生产环境应该是“Prod”。

打开Web.Release.config文件,添加如下代码到appSettings元素节点:

<appSettings>
<!-- Entity Framework initializer transform that you entered earlier -->
<add key="Environment" value="Prod" xdt:Transform="SetAttributes" xdt:Locator="Match(key)"/>
</appSettings>

 

Transform和Locator属性和前面为Entity Framework创建的transform类似。

完成以后,Web.Release.config的appSettings应该是这个样子:

<appSettings>
<add key="DatabaseInitializerForType ContosoUniversity.DAL.SchoolContext, ContosoUniversity.DAL"
value
="Disabled" xdt:Transform="SetAttributes" xdt:Locator="Match(key)"/>
<add key="Environment" value="Prod" xdt:Transform="SetAttributes" xdt:Locator="Match(key)"/>
</appSettings>

 

接着,同样的代码应用到Web.Test.config文件,只是设置value值为"Test"。完成以后Web.Test.config 下的appSettings节点应该像这样:

<appSettings>
<add key="DatabaseInitializerForType ContosoUniversity.DAL.SchoolContext, ContosoUniversity.DAL"
value
="Disabled" xdt:Transform="SetAttributes" xdt:Locator="Match(key)"/>
<add key="Environment" value="Test" xdt:Transform="SetAttributes" xdt:Locator="Match(key)"/>
</appSettings>

 

7. 禁用Debug模式

对于Release build,不需要开启debugging模式。默认情况下Web.release.config transform文件是自动从compilation元素删除debug属性的。因为你创建的Test build 配置是从Release复制的设置,所以Web.Test.config也有这个代码:

<system.web>
<compilation xdt:Transform="RemoveAttributes(debug)"/>
</system.web>

 

该Transform属性定义的是从部署以后的Web.config文件将debug属性删除。

8. 设置连接字符串

因为我们有2个版本的数据库,一个开发环境,一个是测试和生产环境,你需要为测试和生产环境设置相对于开发环境不同的连接字符串。打开Web.Test.config和the Web.Release.config文件后,在<configuration>里添加<connectionStrings>元素,如下:

<connectionStrings>
<add name="DefaultConnection"
connectionString
="Data Source=|DataDirectory|aspnet-Prod.sdf"
providerName
="System.Data.SqlServerCe.4.0"
xdt:Transform
="SetAttributes" xdt:Locator="Match(name)"/>
<add name="SchoolContext"
connectionString
="Data Source=|DataDirectory|School-Prod.sdf"
providerName
="System.Data.SqlServerCe.4.0"
xdt:Transform
="SetAttributes" xdt:Locator="Match(name)"/>
</connectionStrings>

 

该代码使用的Match locator和SetAttributes transform属性和上面的环境标示符配置类似。

对于测试和生产环境的配置,我们都全部设置完了,下一章节,你将学会配置项目属性。

9. 更多信息

对于本章节的内容,更多进一步的信息请访问:ASP.NET Deployment Content Map和ASP.NET Web Application Project Deployment FAQ里的Can I exclude specific files or folders from deployment

转载于:https://www.cnblogs.com/TomXu/archive/2011/11/25/2263089.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/261128.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

myeclipse不编译

错误&#xff1a; org.eclipse.core.internal.registry.configurationElementHandle cannot be cast to org.eclipse.jdt.core.compiler.CompilationParticipant&#xff09; 解决&#xff1a; 关掉MyEclipse>把MyEclipse安装目录下的configuration中的update目录删掉>重…

eclipse配置PHP自动提示代码

为什么80%的码农都做不了架构师&#xff1f;>>> 配置php自动提示代码 &#xff08;html/js和PHP方法一样&#xff09; 1. 打开 Eclipse的 Window -> Preferences -> PHPeclipse -> PHP -> Code Assist 打开里面的Enable auto activation选项,下面有个…

linux卸载minicoda2,MiniConda2下载 MiniConda python 2.7 v4.3.30.2 Linux 64位 官方免费版(附安装步骤) 下载-脚本之家...

MiniConda python 2.7 Linux版是一款可以在Linux系统下使用的Python 环境管理工具&#xff0c;同时MiniConda是一个开源的软件包管理系统和环境管理系统&#xff0c;用于安装多个版本的软件包及其依赖关系&#xff0c;并在它们之间轻松切换&#xff0c;本次为大家提供的是Linux…

使用 python 操作 redis

1.安装pyredis &#xff08;1&#xff09;使用 # easy_install redis &#xff08;2&#xff09;直接编译安装 #wget https://pypi.python.org/packages/source/r/redis/redis-2.9.1.tar.gz #tar xvzf redis-2.9.1.tar.gz #cd redis-2.9.1 #python setup.py install 2.简单的re…

android-XML解析Dom,Sax,Pull

android平台上解析xml的常见的工具有三种&#xff1a;dom,sax&#xff0c;pull。 第一种是DOM&#xff0c; 它的特点是一次全部加载&#xff0c;如果对于数据量小的情况下&#xff0c;它的效率还可以&#xff0c;如果XML文件很大的情况下&#xff0c;速度就会慢起来。 第二种方…

射击的乐趣:WIN32诠释打飞机游戏

一楼留给链接http://blog.csdn.net/crocodile__/article/details/11860129 楼上神贴&#xff0c;膜拜片刻...... 一、游戏玩法和已经实现的功能 1.打开游戏会有提示是否开始游戏。 2.键盘↑↓←→控制保卫者飞机&#xff08;米格21原型&#xff0c;米格粉们千万不要看这架飞机&…

内容营销11金规

内容营销11金规 现在也许是解释和讲述一个很重要观点的好时机&#xff1a;创造给力的内容十分关键&#xff0c;但还不够。你还必须提出满足大量其他目标的材料&#xff0c;而这些材料&#xff0c;符合给力的内容的惯例&#xff0c;或者&#xff08;你知道我们马上谈论这一点&am…

eclipse3.4 SVN插件安装

2019独角兽企业重金招聘Python工程师标准>>> SVN插件: http://subclipse.tigris.org/update_1.6.x 汉化版&#xff0c;现在我这边eclipse3.4是可用的。 转载于:https://my.oschina.net/dreamnight/blog/695060

连接两个linux系统软件,【技术共享】synergy-两台电脑共享一套鼠标键盘-Linuxwindows...

PS:这软件倒是不错,可是这要求两台电脑显示器都可以看到.当然一般我们是用不到的.再加上是局域网,直接用远程桌面连接或者控制软件也可以的.前些天&#xff0c;我把自己的台式电脑搬到实验室&#xff0c;与实验室里分配给我的电脑一起用。为了方便使用&#xff0c;我尝试了下用…

容错性设计

即便你的产品90&#xff05;的时间都运行良好。但是如果在用户需要帮助时置之不理&#xff0c;他们是不会忘记这一点的。——《getting real》 我们有时候不能不面对产品出错的时候。无论设计得多么用心&#xff0c;无论做了多少测试&#xff0c;用户仍然会遇到错误和问题。既然…

Spring Data 系列(二) Spring+JPA入门(集成Hibernate)

通过【Spring Data 系列(一) 入门】的介绍&#xff0c;通过对比的方式认识到Spring提供的JdbcTemplate的强大功能。通过使用JdbcTemplate&#xff0c;操作数据库&#xff0c;不需要手动处理Connection,Statement等底层SQL对象。可是&#xff0c;Spring对数据库的操作还远远没有…

emmet-vim

最近啊&#xff0c;我投奔了网页的开发&#xff0c;看了一本《head first HTML and CSS》的书&#xff0c;感觉非常不错&#xff0c;然后又配置了一些vim里面用到的插件&#xff0c;现在我把学习到的东西记录下来&#xff01; 首先&#xff0c;我不会在这里写emmet 的具体操作方…

百度epoll

epoll编辑epoll是Linux内核为处理大批量句柄而作了改进的poll&#xff0c;是Linux下多路复用IO接口select/poll的增强版本&#xff0c;它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。目 录 1简介 2优点 2.1 支持一个进程打开大数目的socket描述符2.2 …

linux命令 正则表达式,详解Linux命令中的正则表达式

详解Linux命令中的正则表达式Mark Do 2017年9月19日 暂无评论 阅读 981 次命令中的正则表达式如果要在命令输出或文本中筛选内容时使用模糊查找&#xff0c;就需要使用正则表达式。正则表达式是一套由多个元字符组成的模糊查找模式&#xff0c;使用正则表达式可以快速查找和定位…

【转】符串搜索工具及XenoCode字符串自动解密工具

【http://www.cnblogs.com/chengchen/archive/2008/07/14/1242244.html】 我们在使用OD破解软件的时候&#xff0c;字符串搜索是最常用的功能之一。但是在DONET平台下似乎没有什么比较好的软件&#xff0c;于是自己动手写了一个软件。这个软件可以自动搜索DONET程序集中的所有的…

linux 封装python,基于linux下python学习(封装)

一、面向对象类的设计&#xff1a;在程序开发中&#xff0c;要设计一个类&#xff0c;通常需要满足以下三个要求&#xff1a;1、类名 这类事物的名字&#xff0c;满足大驼峰命名法2、属性 这类事物具有什么样的特征3、 方法 这类事物具有什么样的行为eg:小明今年18岁&#xf…

图解RAID 0, RAID 1, RAID 5, RAID 10

RAID(Redundant Array of Independent Disk 独立冗余磁盘阵列)技术是加州大学伯克利分校1987年提出&#xff0c;最初是为了组合小的廉价磁盘来代替大的昂贵磁盘&#xff0c;同时希望磁盘失效时不会使对数据的访问受损 失而开发出一定水平的数据保护技术。RAID就是一种由多块廉价…

Spring JPA 中的Repository体系

为什么80%的码农都做不了架构师&#xff1f;>>> Repository体系 org.springframework.data.repository.Repository<T, ID> ---- Repository体系的顶级接口,是个空接口 interface CrudRepository<T, ID extends Serializable> extends Repository<T,…

Codeforces 258B Little Elephant and Elections

题意&#xff1a;有7个人从m个数中任选一个不重复的&#xff0c;其中4和7是幸运数&#xff0c;一个人的幸运值等于他所选的数字中所有4的个数7的个数。求一个人的幸运值比其他6人幸运值总和大的方案数。 1 #include <iostream>2 #define MOD 10000000073 using namespace…

Python 数据分析 Matplotlib篇 plot设置线条样式(第2讲)

Python 数据分析 Matplotlib篇 plot设置线条样式(第2讲)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ�…