这篇文章是从我的 github 博客 http://lxconan.github.io 导入的。

在上一篇中,我们从零开始创建了一个非常简单的 ASP.NET MVC 应用程序。接下来,你是不是期望我们能够给这个新生的应用程序添加各种各样的功能呢?可惜,不是这样的。我们下面的工作是创造一个自动部署这个应用程序的脚本。这在任何时候都是非常重要的。

这个重要的任务很难在一篇文章中完成,因此我们先看一看自动部署中一个非常重要的部分:web.config 文件。在这篇文章中,我们将解决如下的问题:

  • web.config 文件是个什么东西
  • web.config 对部署的影响

web.config 文件是什么

一般来说,web.config 文件包含了所有运行 ASP.NET 应用程序所需的配置信息。你也许马上发现了破绽:真的是“所有”吗?在上一个应用程序中它一共只有不到10行代码:

<?xml version="1.0"?>

<configuration>
<system.web>
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5" />
</system.web>
</configuration>

但是这个应用却可以依靠着这个配置文件运行在 IIS Express 中,当然,也会运行在 IIS 中。

如果只算这个 web.config 文件,当然没有包含所有的配置。为了运行我们的 Web 应用,至少要包含三个方面的信息:

  • 我们的 Web 应用也是一个 .NET 应用,因此会包含一些 .NET 应用通用配置信息。例如 <connectionString><system.data> 配置节的内容就是此类配置的典型;
  • 其次我们的 Web 应用是一个 ASP.NET Web 应用程序,因此会包含 ASP.NET 相关的配置信息。例如 <system.Web> 配置节的内容就是此类配置的典型;
  • 到目前为止,我们的 Web 应用是 Host 在 IIS 上的,因此需要包含 IIS 相关的配置信息。例如 <system.webServer><system.applicationHost><system.ftpServer> 配置节就是此类配置的典型;

那么这么多的信息是如何组织起来的呢?实际上这些信息是通过一种继承的方式进行组合的。以我们所做的 Web 应用为例。当应用分别部署在 IIS 和 IIS Express 上的时候,会有如下的配置继承结构:

IIS 7:
{.NET Framework Dir}\Config\machine.config
{.NET Framework Dir}\Config\web.config
{IIS Dir}\Config\applicationHost.config
|-{Our Web Application Dir}\web.config IIS Express
{.NET Framework Dir}\Config\machine.config
{.NET Framework Dir}\Config\web.config
{IIS Express Dir}\config\AppServer\applicationHost.config
|-{Our Web Application Dir}\web.config

继承结构的第一级是服务器范围内的根配置文件,这种配置文件有三个:

  • 首先出现的是 machine.config 和根 web.config。其中前者的配置将应用于本机的所有 .NET 应用,而后者的配置将应用于所有的 ASP.NET 应用。这两个文件的路径都位于 .NET Framework 的特定版本所在的目录。例如,例如 .NET 2.0 的安装路径是 %windir%\Microsoft.NET\Framework\v2.0.50727, .NET 4.0 的安装路径是 %windir%\Microsoft.NET\Framework\v4.0.30319(64-bit 的 .NET Framework 的 Framework 文件夹的名字是 Framework64)。
  • 服务器范围内的配置文件还有 applicationHost.config。这个配置文件是用于存储 IIS 的运行配置的,它的值将作用于所有部署于本机 IIS / IIS Express 的应用。

继承结构的第二级就是我们的 Web 应用,这种应用可以存在于 Web 应用的根路径和各级虚拟目录。他们的继承层次和虚拟目录的层次是一致的。

web.config 和部署

继承机制是非常不错的,但是这引入了另外一个问题,如果目标服务器并没有这些默认配置,或者这些配置在不同环境不尽相同,那么我们的应用程序不就不能正常工作了吗?很不幸,被你言中了。这就是为什么当你先安装了 .NET Framework 而后安装了 IIS 服务的话需要执行 aspnet_regiis 的原因了。不过我们还是有几种方法来应对这个问题:

  • 把所有的配置覆写一遍(找抽),这里所谓的覆写仅限于 .NET 应用配置和 ASP.NET 应用配置,IIS 的 applicationHost.config 不要手动更改可以通过 .NET IIS Interop 或者 powershell 的 IIS Extension 进行更改。
  • 重写当前应用程序使用到的的配置节(即使它已经存在在开发环境下的 machine.config 和根 web.config 中);
  • 重置当前服务器的默认配置文件(machine.config 以及 web.config),然后以此为基础,仅仅书写和默认配置不同的配置。

上述三种方法中,后两种方法是比较可行的。但是在阅读了下一篇,也就是关于 ASP.NET 处理机制的介绍之后,你会发现第二种方法仍然存在相当的难度(因为需要覆写的东西实在太多)。因此目前广泛采用的是第三种方法。

以上就是这一篇的内容,现在还不是我们写部署脚本的时候

ASP.NET MVC 从零开始 - Web.config的更多相关文章

  1. ASP.NET MVC 从零开始 - 自动化部署(其二)

    这篇文章是从我的 github 博客 http://lxconan.github.io 导入的. 这是这个系列的第五篇了,前四篇请参见: ASP.NET MVC 从零开始 – Create and R ...

  2. ASP.NET MVC 从零开始 - 请求处理

    这篇文章是从我的 github 博客 lxconan.github.io 导入的. 这是这个系列的第三篇了.前两篇文章请参见: ASP.NET MVC 从零开始 - Create and Run AS ...

  3. ASP.NET MVC 从零开始 - 自动化部署(其一)

    本文是从我的 github 博客 http://lxconan.github.io 导入的. 这是这个系列的第四篇了,前三篇请参见: ASP.NET MVC 从零开始 – Create and Run ...

  4. ABP示例程序-使用AngularJs,ASP.NET MVC,Web API和EntityFramework创建N层的单页面Web应用

    本片文章翻译自ABP在CodeProject上的一个简单示例程序,网站上的程序是用ABP之前的版本创建的,模板创建界面及工程文档有所改变,本文基于最新的模板创建.通过这个简单的示例可以对ABP有个更深 ...

  5. ASP.NET MVC和Web API中的Angular2 - 第2部分

    下载源码 内容 第1部分:Visual Studio 2017中的Angular2设置,基本CRUD应用程序,第三方模态弹出控件 第2部分:使用Angular2管道进行过滤/搜索,全局错误处理,调试客 ...

  6. vs 2013下自定义ASP.net MVC 5/Web API 2 模板(T4 视图模板/控制器模板)

    vs 2013下自定义ASP.net MVC 5/Web API 2  模板(T4 视图模板/控制器模板): Customizing ASP.NET MVC 5/Web API 2 Scaffoldi ...

  7. ASP.NET MVC+Knockout+Web API+SignalR

    架构设计(ASP.NET MVC+Knockout+Web API+SignalR) 架构设计(ASP.NET MVC+Knockout+Web API+SignalR) 2014-01-16 18: ...

  8. Visual Studio 2013 Preview - ASP.NET, MVC 5, Web API 2新功能搶先看

    Visual Studio 2013 Preview - ASP.NET, MVC 5, Web API 2新功能搶先看 來自TechEd North America 2013的第一手消息 以下資訊均 ...

  9. Asp.net中的web.config配置

    目录 Asp.net中的web.config配置... 1 一. 配置文件保存位置... 2 二. 配置文件加载顺序... 2 三. 配置文件节点介绍... 3 1. . 3 2. . 5 3. . ...

随机推荐

  1. HashMap两种遍历方式的深入研究

    转自:http://swiftlet.net/archives/1259 HashMap的遍历有两种方式,如下所示:第一种利用entrySet的方式:   1 2 3 4 5 6 7 Map map ...

  2. D3数据绑定

    这里转载一个非常经典的关于D3数据绑定的帖子,由D3作者自己写的,非常棒,以至于我忍不住全文copy到此. 原文地址 Thinking with Joins Say you’re making a b ...

  3. 多栏多列布局(display:flex)

    display:flex 多栏多列布局浏览器支持情况:火狐直接支持w3c无前缀写法,谷歌和opera支持-webkit- 前缀写法,比较适合移动端开发使用, display:flex 这个牛逼的css ...

  4. 关于UnsupportedClassVersionError的错误处理

    错误:Java.lang.UnsupportedClassVersionError: Bad version number in .class file 造成这种错误的原因是你的支持Tomcat运行的 ...

  5. Spring MVC MultipartFile实现图片上传

    <!--Spring MVC xml 中配置 --><!-- defaultEncoding 默认编码;maxUploadSize 限制大小--><!-- 配置Multi ...

  6. spark shuffle 相关细节整理

    1.Shuffle Write 和Shuffle Read具体发生在哪里 2.哪里用到了Partitioner 3.何为mapSideCombine 4.何时进行排序 之前已经看过spark shuf ...

  7. C语言与java 20155317 王新玮第二次

    20155317 王新玮第二次写作感想   你有什么技能比大多数人(超过90%以上)更好? 刚刚看到这个题目,我的首先想到的是会一些中医,懂得中医的理论框架知识,懂得大部分的中医脉象,能够解决日常生活 ...

  8. oracle导出一条二进制数据(二进制,long只能通过dmp导出)

    exp jxfoc/JXFOC@ORCL file=d:\dd.dmp tables=(jxfoc.FLIGHT_PLAN_MAKE_LOG,jxfoc.METAR_CONTENT_FOR_MAIL) ...

  9. 程序后端调用post请求。

    /// <summary> /// 调用Web API /// </summary> public class InvokeMVCWebAPI { /// <summar ...

  10. oracle触发器和存储过程的格式

    最近接到一个任务要根据一个表来转移另一个表的数据到第三个表.想了想,用决定用触发器+存储过程的方式来做.有些时间没有写存储过程和触发器了,查了一下资料,确定了oracle的触发器和存储过程的格式. 触 ...