Asp.net中的web.config配置
目录
Asp.net中的web.config配置... 1
一、 配置文件保存位置... 2
二、 配置文件加载顺序... 2
三、 配置文件节点介绍... 3
1. . 3
2. . 5
3. . 5
4. . 6
. 11
四、 针对配置文件的一些编程操作... 11
1. 运行时进行配置文件的修改... 11
2. 配置节点的加密... 12
web.config是asp.net中保存配置信息(比如数据库连接字符串等)的重要文件。它是基于xml的文本文件方式放在Web应用程序的任何目录中,并且默认不随源文件编译到Dll中,而运行环境随时监视着它是否有改变,一但有变动,系统会自动重新加载里面的最新内容。
一、 配置文件保存位置
.net的默认配置文件保存在“windows目录\Microsoft.NET\Framework\对应.net版本\config”文件夹下面。不同的操作系统windows目录不一样,我们在命令行下输入“echo %windir%”查看windows目录所在的位置。
clip_image001[1]
图:web.config所在的目录
Asp.net中有两个非常重要的配置文件,分别是machine.config和web.config,它们都位于config文件夹下面。这两个文件一般不需要我们手工是维护它,保持默认即可。但针对asp.net应用程序,它自身会有0个,1个或者多个web.config配置文件,多个配置文件会存在加载顺序问题。下节会介绍。
注意,传说中.net3.0和.net3.5只是在.net2.0的基础上扩充中,所以还是没用的.net2.0的配置文件。它们连config这个目录都没有。
二、 配置文件加载顺序
IIS在Asp.net网站启动时,会加载配置文件中的配置信息,然后缓存这些信息,不会每次要用都去读取配置文件,只是IIS会随时监视着这些文件的变化,一量有变化,它会重新去读取并缓存配置信息。
Asp.net网站运行时会按照以下方式加载配置文件中的节点信息:
1) 如果在当前运行页面所在的目录下有web.config文件,则查找是否存在所需要的节点,如果存在则返回结果,并停止下一步地查找。
2) 如里所在目录不存在web.config配置或者配置文件里没有所需要的节点,则查找它所在的上一级目录的配置文件中的节点,直到网站根目录。(问题:IIS6中的虚拟目录算不算根目录)
3) 如果网站根目录中都不存在web.config或者所需要的配置节点,转而到“windows目录\Microsoft.NET\Framework\对应.net版本\config\web.config”中去查找。
4) 如果第3条中还没找到,继续到“windows目录\Microsoft.NET\Framework\对应.net版本\config\machine.config”中去查找。
5) 如果还没找到,那就报错吧。
存在两个问题
1) IIS6中的虚拟目录算不算根目录。
2) 在系统运行时,在一个原本没有web.config的目录中手工加上一个web.config,会不会自动加载。
三、 配置文件节点介绍
Web.config文件是一个xml文本文件,它的根节点为,该节点下包含常见的子节点有:、、(保存数据库连接字符串)、和。下面针对各节点配置进行介绍。
1.
configSections 元素指定了配置节和处理程序声明。由于 ASP.NET 不对如何处理配置文件内的设置作任何假设,因此这非常必要。但 ASP.NET 会将配置数据的处理委托给配置节处理程序。配置结构信息如下:
每个 section 元素标识一个配置节或元素以及对该配置节或元素进行处理的关联 ConfigurationSection 派生类。可以在 sectionGroup 元素中对 section 元素进行逻辑分组,以对 section 元素进行组织并避免命名冲突。section 和 sectionGroup 元素包含在 configSections 元素中。
如果配置文件中包含 configSections 元素,则 configSections 元素必须是 configuration 元素的第一个子元素。
下面我们来示例写一个自定义配置信息,并完成它的SectionHandler,首先我们在节点下添加configSections。
编写自定义SectionHandler,我们为MySectionHandler返回一个Hashtable的数据。
namespace ConfigTest.SectionHandler
{
public class MySectionHandler : IConfigurationSectionHandler
{
public object Create(object parent, object configContext, System.Xml.XmlNode section)
{
Hashtable ht = new Hashtable();
foreach (XmlNode node in section.ChildNodes)
{
if (node.Name == "add")
{
ht.Add(node.Attributes["key"].Value, node.Attributes["value"].Value);
}
}
return ht;
}
}
}
在页面中使用该Section,由ConfigurationManager.GetSection得到SectionHandler返回的Hashtable。注意参数结构。
protected void Page_Load(object sender, EventArgs e)
{
Hashtable ht = ConfigurationManager.GetSection("mySectionGroup/mySection") as Hashtable;
foreach (DictionaryEntry de in ht)
{
Response.Write(de.Key + " - " + de.Value + "
");
}
}
2.
该节点下主要用来存储asp.net应用程序的一些配置信息,也可以把数据库连接字符串也放在这里,不过.net2.0提供了connectionStrings节点,所以数据库连接字符串还是不建议放在这里,下面为一个图片类型的实例。
调用方法为:
string ImgType = ConfigurationManager.AppSettings["ImgType"];
3.
connectionStrings和appSettings类似,不过用于保存配置数据库连接信息,下面给一个实例。
调用方式为:
string connStr = ConfigurationManager.ConnectionStrings["SqlserverConnStr"].ConnectionString;
4.
为.net应用程序的行为方式配置节点,该节点包含很多子节点,很多子节点已经由.net配置好了,这里我们只来看看一些重要的配置节点。
Ø
其中mode属性有三种值,On/Off/RemoteOnly,默认为RemoteOnly。Error节点指定给定 HTTP 状态代码的自定义错误页面。
Ø
该节点为配置 ASP.NET 身份验证方案,该方案用于识别查看 ASP.NET 应用程序的用户。Mode属性包含四种身份验证模式:
1. Windows(默认)
将 Windows 验证指定为默认的身份验证模式。将它与以下任意形式的 Microsoft Internet 信息服务 (IIS) 身份验证结合起来使用:基本、摘要、集成 Windows 身份验证 (NTLM/Kerberos) 或证书。在这种情况下,您的应用程序将身份验证责任委托给基础 IIS。
2. Forms
将 ASP.NET 基于窗体的身份验证指定为默认身份验证模式。
3. Passport
将 Microsoft Passport Network 身份验证指定为默认身份验证模式。
4. None
不指定任何身份验证。您的应用程序仅期待匿名用户,否则它将提供自己的身份验证。
下面的代码示例演示如何为基于窗体的身份验证配置站点、指定传输来自客户端的登录信息的 Cookie 的名称以及指定当初始身份验证失败时使用的登录页的名称。必须将 authorization 节包含在内才能要求对所有用户进行 Forms 身份验证,并拒绝匿名用户访问站点。
Login.aspx中登陆通过:
FormsAuthentication.RedirectFromLoginPage(this.TextBox1.Text, true);
Ø
HttpHandlers可用于根据请求中指定的 URL 和 HTTP 谓词将传入的请求映射到相应的处理程序。可以针对某个特定的目录下指定的特殊文件进行特殊处理。
下面我们来针对网站path目录下的所有*.abc文件夹来编写自定义HttpHandle。
先添加到配置文件:
编写AbcHttpHandler:
namespace ConfigTest.HttpHandler
{
public class AbcHttpHandler : IHttpHandler, IRequiresSessionState
{
public bool IsReusable
{
get { return true; }
}
public void ProcessRequest(HttpContext context)
{
context.Response.Write("
Hello HttpHandler
");
context.Session["Test"] = "你在调用AbcHttpHandler容器中调用Session";
context.Response.Write(context.Session["Test"]);
}
}
}
系统调用结果:
clip_image002[1]
图:HttpHandler测试
我们还可以使用HttpHandlerFactory来进行handler自行切换。我们先定义两个HttpHandler,分别是httpHandler1和httpHandler2。然后定义一个继承于IHttpHandlerFactory的MyHandlerFactory来动态切换httpHandler,看代码:
namespace ConfigTest.HttpHandler
{
public class MyHandlerFactory : IHttpHandlerFactory
{
public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)
{
if (url.IndexOf("1") > -1)
{
return new HttpHandler1();
}
else if (url.IndexOf("2") > -1)
{
return new HttpHandler2();
}
//返回默认Handler
return context.Handler;
}
public void ReleaseHandler(IHttpHandler handler)
{
// throw new NotImplementedException();
}
}
public class HttpHandler1 : IHttpHandler, IRequiresSessionState
{
public bool IsReusable
{
get { return true; }
}
public void ProcessRequest(HttpContext context)
{
context.Response.Write("
HttpHandler1
");
}
}
public class HttpHandler2 : IHttpHandler, IRequiresSessionState
{
public bool IsReusable
{
get { return true; }
}
public void ProcessRequest(HttpContext context)
{
context.Response.Write("
HttpHandler2
");
}
}
}
这里只是测试,我们设定url中存在1这个字符时用HttpHandler1,存在2这个字符里用HttpHandler2,否则返回系统默认的Handler。我们还得增加配置项:
添加了一个httpHandler的配置项针对HandlerFactory目录下所有文件,我们运行测试一下:
clip_image004[1]
图:HandlerFactory测试
Ø
当请求在管道中传递时,HttpApplicaion对象中一系列的事件被触发.我们已经看到这些事件在Global.asax中作为事件被发布.这种方法是特定于应用程序的,可能并不总是你想要的.如果你要建立一个通用的可用被插入任何Web应用程序的HttpApplication事件钩子,你可用使用HttpModule,这是可复用的,不需要特定语应用程序代码的,只需要web.config中的一个条目.
和HttpHandler一样,编写继承于IHttpModule的HttpModule:
namespace ConfigTest.HttpModule
{
public class MyHttpModule:IHttpModule
{
public void Dispose()
{
throw new NotImplementedException();
}
public void Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(context_BeginRequest);
}
void context_BeginRequest(object sender, EventArgs e)
{
HttpApplication application = (HttpApplication)sender;
HttpContext context = application.Context;
context.Response.Write("Add BeginRequest by MyHttpModule!");
}
}
}
我们只是在每个页面上添加了一句话:Add BeginRequest by MyHttpModule!看结果:
clip_image006[1]
图:HttpModule测试
Location节点是用来指定子配置的资源。如果在asp.net应用程序中想对某个目录做特殊处理,则可以用该节点来实现。举两个例子。
下面的代码示例演示如何仅将指定页的上载文件大小限制设置为 128 KB。
为指定目录的图片加水印:
四、 针对配置文件的一些编程操作
1. 运行时进行配置文件的修改
这里我们演示对appSettings节点进行修改:
public static void SetAppSetting(string key, string value)
{
Configuration config = WebConfigurationManager.OpenWebConfiguration("~");
AppSettingsSection appSetting = config.AppSettings;
//如果不存在则添加
if (appSetting.Settings[key] == null)
{
appSetting.Settings.Add(key, value);
}
else//否则修改
{
appSetting.Settings[key].Value = value;
}
config.Save(ConfigurationSaveMode.Full);
}
2. 配置节点的加密
有时候我们要对关键节点进行加密,.net给我们提供了加密的方法,下面我们演示对connectionStrings节点进行加密:
public static void ProtectSection()
{
Configuration config = WebConfigurationManager.OpenWebConfiguration("~");
ConfigurationSection section = config.Sections["connectionStrings"];
section.SectionInformation.ProtectSection("RsaProtectedConfigurationProvider");
section.SectionInformation.ForceSave = true;
config.Save(ConfigurationSaveMode.Full);
}
这里我们使用的是RsaProtectedConfigurationProvider,加密后connectionStrings节点为:
Rsa Key
Sg75NxcTUSMJwZG9ypLUZh9CeSe6Qa1APhxLpZ+EMNWH4lA9AhEEVbzxAgbWvjPGeJoQfONxpkhjeNVZUTrpm9T6dJMU2vQ6EPmXMMF7Lkng62nQ1LOK+gkTbJT8Z3VsprazFteQAwiBhL8GWB4M94kO7bx6P5Ifu6xgXPYdoEQ=
zf47WegBTe8WdP7Pj8104IP1r0UuqNDYIyFppaN5e5TmtZihJQZZyNGW+NZiJqct+q+OdxPWEPRsi/F1tG/URiXypfNhWjZ7o0xps1LoPQgg8Y2mpQ0J3JVOZM8eNjX3jl5ylzPqUK7TsafyuYiht1ljjL2T+WwcQfqnVFlFsXQkQVWde0WMVeqjnSh09rPwJo4o2H9q9T6adaFDZ1WUzBR6eDRudrXsizI8HxdWuU7bD4z2WdQaO6vSUqK0kMep4zAGZOkbUlEjA800Fv0oTDH2fAgVHFXQxxl5EjQSvcjjZ7yViyjsjLJ5RMb1lxjdBQ0msrzQdELMNFVZ2jUbmwv7Pkvk+qcvIbHWTc+o0u4CGqLomsbMUWwZyqIeRXwYmir+CsjIJ4Cm+c6JOleGLsZSKaFRrFE8QjjkixSIvigVTHa8s58VVFKphZo7ZNm91b+8bucaanl8kaBkTsObUDdhfCk/J97gkyZ5BlHEAxnPAT47cj59P1SQqQoGm0gHujyNS4jTgS9JOdb4gBocPiVMBTzG4MhlWGensHLEuu5x9SqNCKYOGuk14Wo9vb4++JiRxCysDmKucGqQXLwTz0FY/IfA1Q16ns+l5MBFYvAoL8hBRHbGWgAodHHsj3UshlP+JI1+buEgxC8O1R0HPNQuIFXQhvGd2RkDQYhCgohyDlPayldl0EPJGYtOAer530s89t52+rU2XH4K84aXbmgClA5VuAzB
以上所有具体操作可以看Demo实例。
Asp.net中的web.config配置的更多相关文章
- Asp.net中的web.config配置文件(转)
最近开始学习.NET的开发,首先碰到的就是web.config的配置问题,把网上大虾的资料转发记录一下,以备不时之需. 原贴路径如下:http://blog.csdn.net/hbqhdlc/arti ...
- asp.net中web.config配置节点大全详解
最近网上找了一些关于Web.config配置节点的文章,发现很多都写的都比较零散,而且很少有说明各个配置节点的作用和用法.搜索了一下发现有一篇写的不错,这里引用一下 原文地址 http://www.c ...
- Asp.net Web.Config - 配置元素 caching
Asp.net Web.Config - 配置元素 caching 记得之前在写缓存DEMO的时候,好像配置过这个元素,好像这个元素还有点常用. 一.caching元素列表 元素 说明 cache ...
- asp.net项目中通过Web.config配置文件及文件夹的访问权限!
描述:在开发中我们通常会碰到这样的问题,例如:在项目的根目录下面有一个文件或者文件夹需要用户登陆后才能访问.如果用户在没有登录的情况下访问该文件或者该文件夹下面的文件时,直接拦截重定向到对应的登陆页面 ...
- Web.config配置数据库连接
web.config配置数据库连接 第一种:取连接字符串 string connString = System.Web.Configuration.WebConfigurationManager. ...
- web.config配置详细说明
(一).Web.Config是以XML文件规范存储,配置文件分为以下格式 1.配置节处理程序声明 特点:位于配置文件的顶部,包含在<configSections>标志中. 2.特定应 ...
- C#中对Web.Config、App.Config字符串加密与解密的方法
我们平常的项目里面的配置文件通常都是明文形式的存在,现在就是为了项目安全性增强,同时又显得高逼格点, 我们可以采用加密的方式,而我们C#很强大,因为他内置的一些指令方式,很方便而且使用起来还不用解密, ...
- IIS服务器与web.config配置优化指南
摘自: http://www.3lian.com/edu/2012/11-13/43890.html .修改IIS最大工作进程数 a. 请考虑以下几点: .每一个工作进程都会消耗系统资源和CPU占用率 ...
- iis设置默认文档,提示web.config配置xml格式不正确
网站上传后,配置默认文档,提示web.config配置xml格式不正确,几经尝试,发现是sqlserver密码中的“&”符号惹的祸,web.config文件中不能使用该字符.分享出来,大家遇到 ...
随机推荐
- linux ss命令使用详解
ss是Socket Statistics的缩写.顾名思义,ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容.但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信 ...
- [SLAM] 01. "Simultaneous Localization and Mapping"
本篇带你认识SLAM,形成客观的认识和体系 一.通过行业招聘初步了解SLAM 发信人: leecty (Terry), 信区: ParttimeJobPost标 题: 创业公司招SLAM 算法工程师发 ...
- 【Oracle】两个表Join关联更新
两个表关联,用B表的字段更新A表的字段. UPDATE ( SELECT A.COL1 A_COL, B.COL2 B_COL FROM table1 A INNER JOIN table2 B ON ...
- C#实现新建文件并写入内容
using System; using System.IO; namespace ConsoleApplication1 { class Program { static void Main(stri ...
- Swift - static和class的使用
Swift中表示 “类型范围作用域” 这一概念有两个不同的关键字,它们分别是static和class.这两个关键字确实都表达了这个意思,但是在其他一些语言,包括Objective-C中,我们并不会特别 ...
- 节日换肤通用技术方案__iOS端实现
一.问题的提出 不知道大家有没有发现, 元旦期间, 很多APP界面里的图标都换成了具有节日气氛的样式, 而在过了元旦节之后, 这些图标又悄无声息的变回了本来的面貌. 这些具有短暂生命周期.而又必须在固 ...
- HttpClient详细解释
Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们再讨论),它不仅是客户端发送Http请求变得容易,而且 ...
- 【Drools-开源业务规则引擎】入门实例(含源码)
该实例转自:http://blog.csdn.net/quzishen/article/details/6163012 便于理解的应用实例1: 现在我们模拟一个应用场景:网站伴随业务产生而进行的积分发 ...
- C常见机试题
初级: 一.请编写函数long fun(long int x),功能是:将长整型数x中每一位上为奇数的数依次取出,并逆序和顺序分别构成一个新数返回. 例如:程序运行时输入123456789,输出: ...
- MFC onchar()
为什么在CView类中可以对ON_CHAR进行相应,添加消息处理函数onchar就可以了,但是在CDialog中要对ON_CHAR相应,直接添加不行? CView相当于Text控件,你可以在Text控 ...