这篇文章是从我的 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. Jetpack 由 WordPress.com 出品

    官网:https://jetpack.com/ Jetpack 由 WordPress.com 出品. Jetpack 通过为您提供访客统计数据和安全服务.加速图像传输以及帮您获得更多浏览量,可以简化 ...

  2. 阿里开源消息中间件RocketMQ的前世今生-转自阿里中间件

    昨天,我们将分布式消息中间件RocketMQ捐赠给了开源软件基金会Apache. 孵化成功后,RocketMQ或将成为国内首个互联网中间件在Apache上的顶级项目. 消息一出,本以为群众的反应是这样 ...

  3. Eclipse启动时发生An internal error occurred during: "Initializing Java Tooling".错误的解决方法

    问题描述: Eclipse启动时发生An internal error occurred during: "Initializing JavaTooling".错误的解决方法 解决 ...

  4. 1.4 jQuery方法,JSON介绍

    jQuery方法: jQuery添加元素: append()方法: $("元素").append("追加内容"); prepend()方法: $("元 ...

  5. 【刷题笔记】火车购票-----java方案

    问题描述请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配. 假设一节车厢有20排.每一排5个座位.为方便起见,我们用1到100来给所有的座位编号,第一排是1到5号,第二排是6到10号 ...

  6. sql server 代理服务

    sql server 创建维护计划失败.错误代码:c001f011. 从 IClassFactory 为 CLSID 为 {17BCA6E8-A95D-497E-B2F9-AF6AA475916F} ...

  7. mac 终端 常用命令

    基本命令1.列出文件ls 参数 目录名        例: 看看驱动目录下有什么:ls /System/Library/Extensions参数 -w 显示中文,-l 详细信息, -a 包括隐藏文件2 ...

  8. 使用Prerender.io为angular项目做SEO

    现在的项目的为了更好的分工明确,降低耦合都开始采用前后端分离的形式进式开发,我们也采用这种开发形式,前端用angular开发.虽说刚开始也遇各种坑,但是后期熟悉了之后简直爽呆.一个比较大的坑就是SEO ...

  9. xml中DTD解析

    DTD的作用是"文档类型的定义" DTD申明始终以<!DOCTYPE开头(开头后空一格). 本标签一共有三种写法 一.内部DTD: <!DOCTYPE 根元素 [ 文档 ...

  10. 使用Javascript来实现二级联动菜单的效果

    效果图如下: 具体实现步骤如下: 1.所用js代码如下: <script type="text/javascript"> var arr_province=[" ...