这篇文章是从我的 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. QT生成流水账号

    在做数据库课程的时候,要生成财务表,每条记录应该有一个流水账号. 实现思路: 当前时间+随机一个四位数 上代码 //生成流水号 QString adminRecharge::getNumber() { ...

  2. AugularJS特性

    AugularJS特性 AngularJS是一个新出现的强大客户端技术,提供给大家的一种开发强大应用的方式.这种方式利用并且扩展HTML,CSS和javascript,并且弥补了它们的一些非常明显的不 ...

  3. xml_TO_object

    一般对于开发人员拿到的xml文件都是配置文件,所以对于我们来说,最主要要做的事情是将xml的内容封装成对象. 下面展示代码 package javaDom4j; import java.util.Ar ...

  4. [spring源码学习]七、IOC源码-Context

    一.代码实例 如之前介绍的,spring中ioc是它最为核心的模块,前边花了大量时间分析spring的bean工厂和他如何生成bean,可是在我们实际应用中,很少直接使用beanFactory,因为s ...

  5. node cmd bash 相关命令

    添加依赖到package.json npm install lodash --save

  6. C#版 Winform界面 Socket编程 Client客户端

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  7. java 判断两个list是否相等

    /** * 队列比较 * @param <T> * @param a * @param b * @return */ public static <T extends Compara ...

  8. 学习android 官方文档

    9.29 1. 今天,FQ,看到android studio中文网上有一个FQ工具openVPN,我就使用了. 之前用过一个FQ工具开眼,但由于网速慢,我就弃用了. 2. 现在,我就可以FQ去andr ...

  9. 使用 Redis 实现排行榜功能

    排行榜功能是一个很普遍的需求.使用 Redis 中有序集合的特性来实现排行榜是又好又快的选择. 一般排行榜都是有实效性的,比如“用户积分榜”.如果没有实效性一直按照总榜来排,可能榜首总是几个老用户,对 ...

  10. OC--init,initialize,initWithCoder:,initWithFrame:各方法的区别和加载顺序

    1.先把OC的类分清楚各有什么方法 普通类的方法 init initialize: 控制器类的方法 init initialize: initWithCoder: UI控件类的方法 init init ...