在使用win8系统后,突然想运行iis,于是在windows组件中启用iis,并aspnet_regiis.exe -i注册iis后,于是开始发布了一个站点,一切正常
继而,在该站点下添加虚拟目录,然后预览虚拟目录的网页,就会立刻报类似“未能加载程序集“App_Web_utohcdb4”。请确保在访问该页之前已经编译了此程序集。”的错误
我纳闷了,我记得在以前版本的iis上建立一个虚拟目录是何其的简单并且不会出错,搜索后发现,原来右击网站,有了两个选下个“添加应用程序”和“添加虚拟目录”
继续搜了下两者异同 (源自:http://blog.csdn.net/xiaoqijun/article/details/16523811)
A.虚拟目录
虚拟目录是指在站点下建立一个虚拟子目录,指定一个固定的物理路径做为站点的应用路径。
1. 虚拟目录与父级站点共用一个
应用程序池
例如:站点TestWeb(
c:\Inetpub\wwwroot\ TestWeb)下建立了SubTestA(D:\SubTestA)的虚拟目录
若TestWeb为设定了
Framework V2.0,则
SubTestA也必须是Framework V2.0的应用程序,否则将给带来Framework不匹配的各种错误。
2. 虚拟目录必须将可执行文件(dll等)放置在父级站点的bin目录下。
3. 虚拟目录中的web.config文件继承父级站点的web.config.
就是说如果父级站点声明过的引用,在虚拟目录下的web.config中不应重复声明
4. 虚拟目录中的应用其根目录为父级站点的根目录
5. 虚拟目录中的AppSetting.config设置应使用相对路径来进行引用。
B. 应用程序
应用程序是指在父级目录下建立了一个单独的应用程序,独享应用程序池
1. 应用程序可以与父级站点拥有不同的应用程序池
即可以达到TestWeb为Framework V2.0,而SubTestA可以是Framework V4.0,二者互不影响
2. SubTestA的可执行文件独立的放置在根目录下的bin中,不能放置在WebTest的bin目录中
3. SubTestA的web.config独立于WebTest的web.config
4. SubTestA
中的应用其根目录为父级站点的根目录
5.
虚拟目录中的AppSetting.config设置应使用相对路径来进行引用。
应用程序是建立在虚拟目录的基础之上,而应用程序独立于父级站点拥有独立的程序运行机制,这让同一站点拥有了运行不同框架集而不相互影响的能力
实际运用中需要根据不同的情况来选择虚拟目录或应用程序
考虑到我只是需要某网站的一个映射网址,两个发布文件没有任何关系,也不想公用任何config或者dll文件
于是还是老实的“添加应用程序”来解决问题吧
于是,我还是不甘心,去iis网站配置文件applicationHost.config(C:\Windows\System32\inetsrv\config)中查看到部分内容
(publish和test2.0是添加的虚拟目录,test2.0_是添加的应用程序)对应配置如下:
<sites>
<site name="
Default Web Site" id="1">
<application path="/">
<virtualDirectory path="/" physicalPath="%SystemDrive%\inetpub\wwwroot" />
</application>
<bindings>
<binding protocol="http" bindingInformation="*:80:" />
</bindings>
</site>
<site name="test1.0" id="2" serverAutoStart="true">
<application path="/" applicationPool="test1.0">
<virtualDirectory path="/test2.0" physicalPath="F:\asp.net\test 2.0\publish2.0" />
<virtualDirectory path="/publish" physicalPath="F:\asp.net\html5拖拽上传\test\publish" />
</application>
<application path="/test2.0_" applicationPool="test1.0">
<virtualDirectory path="/" physicalPath="F:\asp.net\test 2.0\publish2.0" />
</application>
<bindings>
<binding protocol="http" bindingInformation="192.168.1.107:8080:" />
</bindings>
</site>
<siteDefaults>
<logFile logFormat="W3C" directory="%SystemDrive%\inetpub\
logs\LogFiles" />
<traceFailedRequestsLogging directory="%SystemDrive%\inetpub\logs\FailedReqLogFiles" />
</siteDefaults>
<applicationDefaults applicationPool="DefaultAppPool" />
<virtualDirectoryDefaults allowSubDirConfig="true" />
</sites>
很清楚的看到,site(站点),application(应用程序),virtualDirectory(虚拟目录)的层次关系,并可以说明为:
一个site中可以有一个或者多个application,一个application中可以有一个或者多个virtual directory,而一个virtual directory则对应着一个物理路径。一个site默认会至少有一个application,称为根应用程序(root application)或者默认应用程序(default application),而一个application至少有一个vitual director,称为根虚拟目录(root virtual directory)
也许在早版本的iis中,例如iis6,应用程序和虚拟目录是没有太大严格区分的,在
IIS7以上,这三者则被规范化起来,在IIS
架构层面上明确了三者的层次关系。具体可以参考:
http://www.cr173.com/html/18969_1.html
所以添加应用程序,本质上还是为其配置一个虚拟目录,根据path和 physicalPath很清楚的知道,iis是如何帮我们映射物理路径的