时间:2021-05-18
本章我们将讲解ASP.NET5项目发布部署相关的内容,示例项目以我们前一章创建的BookStore项目为例。
发布前的设置
由于新版ASP.NET5支持多版本DNX运行环境的发布和部署,所以在部署之前,我们需要设定部署的目标DNX(即之前的KRE)。
步骤:右键BookStore项目->属性->Application选项卡,选择DNX的版本,本例中,选择dnx-coreclr-win-x64.1.0.0-beta4。
在project.json文件的commands节点,我们可以看到,系统默认配置了3个调试命令,分别如下:
命令 描述 web 启动WebListener服务,该服务可以让web程序脱离IIS运行,默认地址是http://localhost:5000。 gen 使用该命令可以生成MVC相关的代码,比如Controller,目前还用不到。 ef Entity Framework迁移命令,用于迁移数据使用,本例我们还用户不到。理论上来说,我们F5运行的时候,应该是启动web命令,但是在VS2015中,默认的运行环境依然是IIS Express,所以F5调试的时候,会默认启动IIS Express。
gen参考:https://pile during publishing复选框。
这样就可以生成响应的dll文件, 但是这些dll文件依然不在wwwroot/bin目录下,而是在approot\packages\BookStore\1.0.0目录下,在该目录下有2个文件夹,分别是lib和root,以及相关的Nuget的spec文件,在lib目录下,生成的是不同dnx版本的dll文件,而root则是类似于之前的web根目录,因为在该目录下除了有视图文件以外,还和以前的结构一样,保留了bin目录,并且在bin目录下的Release文件夹下,也有一份针对不同dnx版本的dll文件副本。
提示:上述选择中,另外一个Delete all existing files prior to publish也可以勾选上,以便在发布时将之前发布版本的所有文件全部清空。
此时,我们通过web.cmd文件或者IIS模式来验证发布的文件,经验证,均可以正常运行。再仔细对比两份不同设在的发布文件,发现,除了dll文件以外,web.config文件的应用程序路径也变了,即从原来的:
<add key="kre-app-base" value="..\approot\src\BookStore" />变成了如下版本:
<add key="kre-app-base" value="..\approot\packages\BookStore\1.0.0\root" />而web.cmd文件的内容,也从如下内容:
@"%~dp0approot\packages\dnx-coreclr-win-x64.1.0.0-beta4\bin\dnx.exe" --appbase "%~dp0approot\src\BookStore" Microsoft.Framework.ApplicationHost web %*变成了如下内容:
@"%~dp0approot\packages\kre-coreclr-win-x64.1.0.0-beta4\bin\dnx.exe" --appbase "%~dp0approot\packages\BookStore\1.0.0\root" Microsoft.Framework.ApplicationHost web %*上述变化,我们是可以理解的,即将src源码动态编译运行的模式修改为预编译dll程序集的模式。所以,在这里我们可以看到,在源码动态编译模式下,其发布后的文件夹结构如下:
//源码动态编译模式wwwroot/bin/Microsoft.AspNet.Loader.IIS.dllwwwroot/Contents/site.csswwwroot/Contents/...............................................................................................wwwroot/Scripts/jquery.jswwwroot/Scripts/........................................................................................................................................................approot/src/BootStore/project.jsonapproot/src/BootStore/...............................approot/src/BootStore.Data/project.jsonapproot/src/BootStore.Data/..............................approot/src/BootStore.Bussiness/project.jsonapproot/src/BootStore.Bussiness/.........................approot/packages/Elmah/{version}/...............................................................................而dll预编译模式下的发布文件夹结构如下:
//dll预编译模式wwwroot/bin/Microsoft.AspNet.Loader.IIS.dllwwwroot/Contents/site.csswwwroot/Contents/...............................................................................................wwwroot/Scripts/jquery.jswwwroot/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程序集引用,示例如下:
另外,还多了如下两个节点值(具体功能暂不明确):
"entryPoint": "BookStore","loadable": false猜想,这些不同,可能是因为在动态编译模式下需要引用这些被移除的程序集进行编译,而预编译dll模式下,都已经编译好了,所以就不再需要这些程序集了,而root目录只需要引用BookStore程序集就可以了,而BookStore程序集对这些程序集的依赖,详细在该dll程序集的nupkg文件里是可以自动解析并下载的吧(这一点待验证)。
以上是新版ASP.NET5项目在发布流程和相关技术的一些内容,从这里大家可以看到,ASP.NET5是彻底模块化了,IIS不再是运行MVC程序的唯一容器,任何兼容DNX的运行容器都可以运行MVC程序,程序发布包被分为approot和wwwroot两个部分,分别存放应用程序集(或源码)和静态文件,从而做到更好的分离。在下一章,我们会讨论,ASP.NET 5的运行原理。
注意:目前还没有办法通过复制源码的形式来进行调试,同时也没办法将IIS指向到源码中进行调试,这将会改变开发人员的开发习惯。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
一、ASP.NETMVC的本地化支持ASP.NETMVC的是基于ASP.NET运行,所以由ASP.NET提供的所有功能,都可以在MVC里使用,例如缓存,会话状态
学习是使用asp.net已经有很长一段时间了,现在就来分析一下mvc的整过过程吧。个人计划写一个mvc系列的博文,仅从源代码的角度来分析mvc。在接触mvc时我
本文实例讲述了ASP.NET在MVC中MaxLength特性设置无效的解决方法。分享给大家供大家参考。具体分析如下:一、问题:在ASP.NETMVC项目中,给某
很多人会问ASP和ASP.net有什么区别呢?ASP与ASP.NET是Microsoft公司在Web应用程序开发上的两项重要技术。虽然ASP和ASP.net
很多人会问ASp和ASp.net有什么区别呢?ASp与ASp.NET是Microsoft公司在Web应用程序开发上的两项重要技术。虽然ASp和ASp.net从字