HttpModule的不到文件或程序集名称或找不到它的一个依赖项

HttpModule 是个好东西,很多程序都有用到,例如DotText、Asp.Net Forums等,但是有一个问题,当我们将使用了HttpModule 的程序设置为站点根目录(以将DotText设置为站点目录为例),然后再在根目录下建虚拟目录,运行虚拟目录里的asp.net程序会提示出错:

分析器错误信息: 找不到文件或程序集名称“Dottext.Web”,或找不到它的一个依赖项。

源错误:

行 145:
行 146: <httpModules>
行 147:    <add name="ServiceRouter" type= "Dottext.Web.Modules.BlogServiceModule, Dottext.Web" />
行 148: </httpModules>
行 149:

也就是说对于虚拟目录中的asp.net应用程序,会首先去加载其所在站点中的HttpModule,而一般虚拟目录中的bin目录是不会有HttpModule所在的DLL的,所以就会出如上的错误。
注意,其中的错误提示信息(找不到文件或程序集名称“Dottext.Web”,或找不到它的一个依赖项。)很有误导性,一开始让我以为是需要每个虚拟目录拷贝一个Dottext.Web.dll进去呢,但是将dll拷贝过去后,其HttpModule会对虚拟目录中的asp.net应用程序产生影响,因此这个问题曾让我郁闷了很久。

后来偶然查msdn中,发现web.config里面的HttpModule是有三种子节点的:
<httpModules>
   <add
type="classname,assemblyname" name="modulename"/>
   <remove name="modulename"/>
   <clear/>
</httpModules> 

子标记 说明
<add> 将 HttpModule 类添加到应用程序。 请注意,如果以前已指定了相同的谓词/路径组合(例如在父目录的 Web.config 文件中),则对 的第二个调用将重写以前的设置。
<remove> 从应用程序移除 HttpModule 类。
<clear> 从应用程序移除所有 HttpModule 映射。

唉,其实看到add也应该想到remove的,在虚拟目录中的web.config中Remove一下不需要的HttpModule,发现果然没有问题了!如:
<httpModules>
    <remove
name="ServiceRouter"/>
</httpModules>
 

注意一般表用<clear/>,因为用<clear/>会把machine.config中定义的httpModule一起清除了从而导致asp.net程序不能正常运行。

有一点我很疑惑的是既然都是用remove移除这个HttpModule了,为什么还需要将该HttpModule对应的dll拷贝到虚拟目录的dll下。

httpHandlers的处理方法也类似。

http://blog.joycode.com/dotey/archive/2004/11/30/40010.joy

加支付宝好友偷能量挖...


评论(0)网络
阅读(123)喜欢(0)Asp.Net/C#/WCF