解读ASP.NET 5 & MVC6系列教程(3):项目发布与部署(3)

上述变化,我们是可以理解的,即将src源码动态编译运行的模式修改为预编译dll程序集的模式。所以,在这里我们可以看到,在源码动态编译模式下,其发布后的文件夹结构如下:

//源码动态编译模式 wwwroot/bin/Microsoft.AspNet.Loader.IIS.dll wwwroot/Contents/site.css wwwroot/Contents/....................................... ........................................................ wwwroot/Scripts/jquery.js wwwroot/Scripts/........................................ ........................................................ ........................................................ approot/src/BootStore/project.json approot/src/BootStore/............................... approot/src/BootStore.Data/project.json approot/src/BootStore.Data/.............................. approot/src/BootStore.Bussiness/project.json approot/src/BootStore.Bussiness/......................... approot/packages/Elmah/{version}/....................... ........................................................

而dll预编译模式下的发布文件夹结构如下:

//dll预编译模式 wwwroot/bin/Microsoft.AspNet.Loader.IIS.dll wwwroot/Contents/site.css wwwroot/Contents/....................................... ........................................................ wwwroot/Scripts/jquery.js wwwroot/Scripts/........................................ ........................................................ ........................................................ approot/packages/BootStore/{version}/................... approot/packages/BootStore.Data/{version}/.............. approot/packages/BootStore.Bussiness/{version}/......... approot/packages/Elmah/{version}/.......................

IIS和web.cmd模式的不同

虽然我们对dnx内容的原理不太理解,但有一点内容,我们要记住,那就是两种模式下,对静态文件的访问模式可能不太一样。原因是因为,虽然IIS模式的根目录就是存放静态文件的地方,但是web.cmd文件事先启动的却是approot\src\BookStore目录或approot\packages\BookStore\1.0.0\root目录,两个目录下均没有静态文件,因为静态文件时在wwwroot目录下的,我们猜想,在这种模式下,肯定会有一种机制在来映射这些静态文件,通过查找文件发现,在approot\src\BookStore目录下的project.json文件中的webroot键的值,从解决方案中默认的wwwroot变成了"../../../wwwroot",也就是说kre在映射静态文件的时候,应该是根据这个相对目录来查找这些文件的。

同理,approot\packages\BookStore\1.0.0\root目录下的project.json文件中的webroot键的值,也从wwwroot变成了"../../../../../wwwroot"(因为本来project.json文件的层级就深)。

由于IIS是通过AspNet.Loader.dll做中转,将请求转交给DNX来运行的,那么在IIS模式下,静态文件的请求到底是IIS来处理,还是KRE来处理呢?我们来验证一下,验证步骤如下:

创建一个wwwroot2文件夹和wwwroot同级,并将wwwrooot目录下的静态文件剪切到wwwroot2目录下。将project.json(如果是预编译模式,则需要修改root目录下的project.json)文件中的webroot值中的wwwroot修改为wwwroot2。继续以IIS模式运行该站点

结果发现,静态文件访问不了了(CSS、JS、Images均失效了),但我们再通过web.cmd运行时,这些静态文件却又可以访问了。由此得知,在IIS模式下,静态文件走的是IIS的管线Pipeline,而不是DNX的关系Pipeline。

两种发布模式下的project.json文件不同

动态编译模式和预编译dll模式这两种模式的自动发布程序,生成后的project.json文件有一些变化,具体变化如下。

动态编译模式
基本上和解决方案里的project.json文件相同,唯一的不同就是webroot的相对路径的修改。

预编译dll模式
原来引用的众多程序集从dependencies节点中移除了,取而代之的是BookStore程序集引用,示例如下:

"dependencies": { "BookStore": "1.0.0" },

另外,还多了如下两个节点值(具体功能暂不明确):

"entryPoint": "BookStore", "loadable": false

猜想,这些不同,可能是因为在动态编译模式下需要引用这些被移除的程序集进行编译,而预编译dll模式下,都已经编译好了,所以就不再需要这些程序集了,而root目录只需要引用BookStore程序集就可以了,而BookStore程序集对这些程序集的依赖,详细在该dll程序集的nupkg文件里是可以自动解析并下载的吧(这一点待验证)。

以上是新版ASP.NET5项目在发布流程和相关技术的一些内容,从这里大家可以看到,ASP.NET5是彻底模块化了,IIS不再是运行MVC程序的唯一容器,任何兼容DNX的运行容器都可以运行MVC程序,程序发布包被分为approot和wwwroot两个部分,分别存放应用程序集(或源码)和静态文件,从而做到更好的分离。在下一章,我们会讨论,ASP.NET 5的运行原理。

注意:目前还没有办法通过复制源码的形式来进行调试,同时也没办法将IIS指向到源码中进行调试,这将会改变开发人员的开发习惯。

您可能感兴趣的文章:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wjyszf.html