Aspnet中的web config配置Word文件下载.docx
《Aspnet中的web config配置Word文件下载.docx》由会员分享,可在线阅读,更多相关《Aspnet中的web config配置Word文件下载.docx(14页珍藏版)》请在冰豆网上搜索。
这两个文件一般不需要我们手工是维护它,保持默认即可。
但针对应用程序,它自身会有0个,1个或者多个web.config配置文件,多个配置文件会存在加载顺序问题。
下节会介绍。
注意,传说中.net3.0和.net3.5只是在.net2.0的基础上扩充中,所以还是没用的.net2.0的配置文件。
它们连config这个目录都没有。
二、配置文件加载顺序
IIS在A网站启动时,会加载配置文件中的配置信息,然后缓存这些信息,不会每次要用都去读取配置文件,只是IIS会随时监视着这些文件的变化,一量有变化,它会重新去读取并缓存配置信息。
A网站运行时会按照以下方式加载配置文件中的节点信息:
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文本文件,它的根节点为<
configuration>
该节点下包含常见的子节点有:
、<
(保存数据库连接字符串)、<
和<
。
下面针对各节点配置进行介绍。
configSections元素指定了配置节和处理程序声明。
由于ASP.NET不对如何处理配置文件内的设置作任何假设,因此这非常必要。
但ASP.NET会将配置数据的处理委托给配置节处理程序。
配置结构信息如下:
!
--定义配置节处理程序与配置元素之间的关联。
-->
section/>
--定义配置节处理程序与配置节之间的关联。
sectionGroup/>
--移除对继承的节和节组的引用。
remove/>
--移除对继承的节和节组的所有引用,只允许由当前section和sectionGroup元素添加的节和节组。
clear/>
/configSections>
每个section元素标识一个配置节或元素以及对该配置节或元素进行处理的关联ConfigurationSection派生类。
可以在sectionGroup元素中对section元素进行逻辑分组,以对section元素进行组织并避免命名冲突。
section和sectionGroup元素包含在configSections元素中。
如果配置文件中包含configSections元素,则configSections元素必须是configuration元素的第一个子元素。
下面我们来示例写一个自定义配置信息,并完成它的SectionHandler,首先我们在<
节点下添加configSections。
sectionGroupname="
mySectionGroup"
>
sectionname="
mySection"
requirePermission="
true"
type="
ConfigTest.SectionHandler.MySectionHandler,ConfigTest.SectionHandler"
/>
/sectionGroup>
mySectionGroup>
mySection>
addkey="
key1"
value="
value1"
key2"
value2"
key3"
value3"
key4"
value4"
key5"
value5"
/mySection>
/mySectionGroup>
compilationdebug="
targetFramework="
4.0"
/system.web>
/configuration>
编写自定义SectionHandler,我们为MySectionHandler返回一个Hashtable的数据。
namespaceConfigTest.SectionHandler
{
publicclassMySectionHandler:
IConfigurationSectionHandler
publicobjectCreate(objectparent,objectconfigContext,System.Xml.XmlNodesection)
Hashtableht=newHashtable();
foreach(XmlNodenodeinsection.ChildNodes)
if(node.Name=="
add"
)
ht.Add(node.Attributes["
key"
].Value,node.Attributes["
value"
].Value);
}
returnht;
在页面中使用该Section,由ConfigurationManager.GetSection得到SectionHandler返回的Hashtable。
注意参数结构。
protectedvoidPage_Load(objectsender,EventArgse)
Hashtableht=ConfigurationManager.GetSection("
mySectionGroup/mySection"
)asHashtable;
foreach(DictionaryEntrydeinht)
Response.Write(de.Key+"
-"
+de.Value+"
br>
"
);
该节点下主要用来存储应用程序的一些配置信息,也可以把数据库连接字符串也放在这里,不过.net2.0提供了connectionStrings节点,所以数据库连接字符串还是不建议放在这里,下面为一个图片类型的实例。
--图片类型扩展名-->
ImgType"
.bmp;
.jpg;
.gif;
.png"
/>
/appSettings>
调用方法为:
stringImgType=ConfigurationManager.AppSettings["
];
connectionStrings和appSettings类似,不过用于保存配置数据库连接信息,下面给一个实例。
addname="
SqlserverConnStr"
connectionString="
DataSource=Aron1;
InitialCatalog=pubs;
UserId=sa;
Password=asdasd;
OrcleConnStr"
Provider=msdaora;
DataSource=MyOracleDB;
UserId=UserName;
/connectionStrings>
调用方式为:
stringconnStr=ConfigurationManager.ConnectionStrings["
].ConnectionString;
为.net应用程序的行为方式配置节点,该节点包含很多子节点,很多子节点已经由.net配置好了,这里我们只来看看一些重要的配置节点。
Ø
<
customErrors>
customErrorsdefaultRedirect="
GenericError.htm"
mode="
RemoteOnly"
errorstatusCode="
500"
redirect="
InternalError.htm"
/customErrors>
其中mode属性有三种值,On/Off/RemoteOnly,默认为RemoteOnly。
Error节点指定给定HTTP状态代码的自定义错误页面。
authentication>
该节点为配置ASP.NET身份验证方案,该方案用于识别查看ASP.NET应用程序的用户。
Mode属性包含四种身份验证模式:
1.Windows(默认)
将Windows验证指定为默认的身份验证模式。
将它与以下任意形式的MicrosoftInternet信息服务(IIS)身份验证结合起来使用:
基本、摘要、集成Windows身份验证(NTLM/Kerberos)或证书。
在这种情况下,您的应用程序将身份验证责任委托给基础IIS。
2.Forms
将ASP.NET基于窗体的身份验证指定为默认身份验证模式。
3.Passport
将MicrosoftPassportNetwork身份验证指定为默认身份验证模式。
4.None
不指定任何身份验证。
您的应用程序仅期待匿名用户,否则它将提供自己的身份验证。
下面的代码示例演示如何为基于窗体的身份验证配置站点、指定传输来自客户端的登录信息的Cookie的名称以及指定当初始身份验证失败时使用的登录页的名称。
必须将authorization节包含在内才能要求对所有用户进行Forms身份验证,并拒绝匿名用户访问站点。
authenticationmode="
Forms"
formsname="
401kApp"
loginUrl="
/login.aspx"
/authentication>
authorization>
denyusers="
?
/authorization>
Login.aspx中登陆通过:
FormsAuthentication.RedirectFromLoginPage(this.TextBox1.Text,true);
httpHandlers>
HttpHandlers可用于根据请求中指定的URL和HTTP谓词将传入的请求映射到相应的处理程序。
可以针对某个特定的目录下指定的特殊文件进行特殊处理。
下面我们来针对网站path目录下的所有*.abc文件夹来编写自定义HttpHandle。
先添加到配置文件:
addpath="
path/*.abc"
verb="
*"
type="
ConfigTest.HttpHandler.AbcHttpHandler,ConfigTest.HttpHandler"
/httpHandlers>
编写AbcHttpHandler:
namespaceConfigTest.HttpHandler
publicclassAbcHttpHandler:
IHttpHandler,IRequiresSessionState
publicboolIsReusable
get{returntrue;
}
publicvoidProcessRequest(HttpContextcontext)
context.Response.Write("
h1>
b>
HelloHttpHandler<
/b>
/h1>
context.Session["
Test"
]="
你在调用AbcHttpHandler容器中调用Session"
;
context.Response.Write(context.Session["
]);
系统调用结果:
HttpHandler测试
我们还可以使用HttpHandlerFactory来进行handler自行切换。
我们先定义两个HttpHandler,分别是httpHandler1和httpHandler2。
然后定义一个继承于IHttpHandlerFactory的MyHandlerFactory来动态切换httpHandler,看代码:
publicclassMyHandlerFactory:
IHttpHandlerFactory
publicIHttpHandlerGetHandler(HttpContextcontext,stringrequestType,stringurl,stringpathTranslated)
if(url.IndexOf("
1"
)>
-1)
returnnewHttpHandler1();
elseif(url.IndexOf("
2"
returnnewHttpHandler2();
//返回默认Handler
returncontext.Handler;
publicvoidReleaseHandler(IHttpHandlerhandler)
//thrownewNotImplementedException();
publicclassHttpHandler1:
HttpHandler1<
publicclassHttpHandler2:
HttpHandler2<
这里只是测试,我们设定url中存在1这个字符时用HttpHandler1,存在2这个字符里用HttpHandler2,否则返回系统默认的Handler。
我们还得增加配置项:
HandlerFactory/*.*"
ConfigTest.HttpHandler.MyHandlerFactory,ConfigTest.HttpHandler"
添加了一个httpHandler的配置项针对HandlerFactory目录下所有文件,我们运行测试一下:
HandlerFactory测试
httpModules>
当请求在管道中传递时,HttpApplicaion对象中一系列的事件被触发.我们已经看到这些事件在Global.asax中作为事件被发布.这种方法是特定于应用程序的,可能并不总是你想要的.如果你要建立一个通用的可用被插入任何Web应用程序的HttpApplication事件钩子,你可用使用HttpModule,这是可复用的,不需要特定语应用程序代码的,只需要web.config中的一个条目.
MyHttpModule"
ConfigTest.HttpModule.MyHttpModule,ConfigTest.HttpModule"
/httpModules>
和HttpHandler一样,编写继承于IHttpModule的HttpModule:
namespaceConfigTest.HttpModule
publicclassMyHttpModule:
IHttpModule
publicvoidDispose()
thrownewNotImplementedException();
publicvoidInit(HttpApplicationcontext)
context.BeginRequest+=newEventHandler(context_BeginRequest);
voidcontext_BeginRequest(objectsender,EventArgse)
HttpApplicationapplication=(HttpApplication)sender;
HttpContextcontext=application.Context;
AddBeginRequestbyMyHttpModule!
我们只是在每个页面上添加了一句话:
看结果:
HttpModule测试
Location节点是用来指定子配置的资源。
如果在应用程序中想对某个目录做特殊处理,则可以用该节点来实现。
举两个例子。
下面的代码示例演示如何仅将指定页的上载文件大小限制设置为128KB。
locationpath="
UploadPage.aspx"
httpRuntimemaxRequestLength="
128"
/location>
为指定目录的图片加水印:
images"
addverb="
path="
*.jpg"
ImageHandler"
--图片水印设置Handler-->
四、针对配置文件的一些编程操作
1.运行时进行配置文件的修改
这里我们演示对appSettings节点进行修改:
publicstaticvoidSetAppSetting(stringkey,stringvalue)
Configurationconfig=WebConfigurationManager.OpenWebConfiguration("
~"
AppSettingsSectionappSetting=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节点进行加密:
publicstaticvoidProtectSection()
ConfigurationSectionsection=config.Sectio