解读ASP.NET 5 & MVC6系列(4):核心技术与环境配置

原文:解读ASP.NET 5 & MVC6系列(4):核心技术与环境配置

asp.net 5是下一代的asp.net,该版本进行了全部重写以适用于跨平台,新新版本中,微软引入了如下工具与命令:DNVM、DNX、DNU。

DNVM(.NET Version Manager):由于要实现跨平台的目录,微软提供了DNVM功能,DNVM是ASP.NET最底层的内容,他是一组Powershell脚本,用于启动指定版本的ASP.NET运行环境,并且可以在同一台机器的同一时间点上通过使用Nuget工具来管理各种版本的ASP.NET运行环境(DNX),以及进行相应的升级操作。

DNX(.NET Execution Environment):DNX是ASP.NET程序的运行环境,用于启动并运行ASP.NET程序。该运行环境包括了编译系统、SDK工具集、Native CLR宿主环境。可以使用DNVM管理各种版本的DNX,如dnvm list命令可以列出所有可用的DNX环境,而dnvm install 0.1-alpha-build-0446则可以将指定版本的DNX安装到.dnx文件夹,你可以在%USERPROFILE%\.dnx\runtimes 目录下找到已安装所有版本的DNX。不同的操作系统有不同的DNX版本。

dnx.exe:dnx.exe是用于启动自宿主环境(Self-Hosting)的命令行工具,在使用命令行代码进行自宿主环境启动程序时,dnx负责查找并调用CLR Native Host,dnx命令是整个运行环境的入口点,你可以使用dnx run来启动程序。

dnu(DNX Utility):是一个命令行的包管理器,包含在DNX内,所以只要安装了DNX,就可以使用dnu命令, 其可以用于恢复程序包、安装程序包、部署程序包等等,比如把project.json里自定义的程序集自动下载下来进行使用。

DNX架构及运行原理

DNX是ASP.NET程序运行的核心,其遵循如下两个准则:

  1. DNX应该是自包含的,DNX在解析完应用程序依赖树以后才能知道要使用哪个Core CLR包,所以在得到解析树之前,DNX是无法加载任何CLR的,但Roslyn编译器除外。
  2. 依赖注入(Dependency Injection,简称DI)贯穿着整个系统栈,DI是DNX的一个核心部分,所有DNX上的类库都构建在DI之上。

DNX执行环境的分层架构如下:

Layer 0:Native Process

该层的功能非常简单,主要就是用于查找并调用Layer 1里的CLR Native Host,并将系统相关的参数传递给native host,以便后续使用。目前Windows下使用DNX.exe来处理这个事情,而IIS也提供了一个中介(网站bin目录下提供一个AspNet.Loader.dll)可以将请求转发给Native Host;而Linux和Mac则通过其相应版本的dnx来支持这项功能。

DNX用法:

dnx.exe --lib {paths} --appbase {path} [ProgramName]

--lib {paths}:程序集dll的保存地址(一般是引用的第三方程序集和项目预编译程序集),该地址是Layer 2层的托管代码入口点可以加载程序集的地方。

--appbase {path}:程序保存的目录,默认为%CD%。

[ProgramName]:程序名称,该程序所在的程序集(或者是含有Programe::Main的dll)保存在--lib 路径下,默认值是appbase\project.json里的name。大多数情况下,该名称都是包含着加载链的程序宿主(Microsoft.Net.ApplicationHost)。但是,如果你的程序包含了入口点(Main方法),并被编译到--lib目录下的话,你就可以使用该程序集的名称作为[ProgramName],这种方式将完全忽略加载链并直接启动你的程序。

Layer 1 : CLR Native Host

这一层的内容依赖于你所选择呢CLR版本,该层有如下两个职责:

  1. 启动CLR,启动哪个CLR取决于你选择的CLR版本。如果是Core CLR,该层会加载coreclr.dll,配置并启动运行环境,然后创建应用程序域(AppDomain),以便运行所有的托管代码。
  2. 调用托管代码的入口点(Layer 2),一旦Native Host的入口点返回了该线程,就会把CLR的线程清理干净并关闭,比如,卸载应用程序域(AppDomain)并停止运行环境。

Layer 2:Managed Entry Point

Layer 2层(托管代码入口)是编写托管代码的第一层,其职责如下:

  1. 创建LoaderContainer(其包含需要的ILoaders),ILoader负责根据程序集的名称来加载程序集。CLR需要一个程序集的话,LoaderContainer就会使用其ILoader来解析所需要的程序集。
  2. --lib的路径目录下,用根ILoader来加载程序集,并解析其依赖。
  3. 调用程序的主入口点。

Layer 3:Application host/Application

如果开发人员将整个程序编译成程序集放在libpath目录下,那该层就是你的应用程序了。使用的时候,将含有程序入口点的程序集名称作为[ProgramName]的参数传入即可,Layer 2层会直接调用该程序集。

不过,一般其它情况下,都会使用一个应用程序宿主(Application host)来解析程序的依赖内容并启动运行程序。Microsoft.Net.ApplicationHost是运行环境提供的应用程序宿主,并拥有如下职责:

  1. 解析project.json里定义的各种依赖程序集。
  2. 将一个ILoader添加到LoaderContainer,以便从各种地方(如源代码、NuGet、Roslyn等)加载相应的程序集。
  3. 调用程序集的入口点,将其作为下一个参数,传递给DNX.exe。

Layer 4:Application

这一层,就是开发人员开发的程序,其运行在应用程序宿主之上。

环境配置:

要对ASP.NET 5程序的运行环境DNX进行配置,首先需要安装并配置DNVM,不同的操作系统安装DNVM的时候不太一样,我们在这里大概讲解一下。

Windows安装命令

//需要安装powershell 3.0
@powershell -NoProfile -ExecutionPolicy unrestricted -Command "iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/aspnet/Home/master/dnvminstall.ps1'))"

Linux

curl -sSL https://raw.githubusercontent.com/aspnet/Home/master/dnvminstall.sh | sh && source ~/.dnx/dnvm/dnvm.sh

Mac OS X
在Mac上,首先要安装Mac系统本身的包管理器Homebrew(http://brew.sh),并使用brew tap aspnet/k命令将指定到ASP.NET5相关的git存储库,比如执行如下命令:

brew install dnvm

该命令将会自动从ttps://www.nuget.org/api/v2上下载最新的DNX,下载以后,如果你的系统不识别dnvm的话,你还需要再执行一下如下语句:

source dnvm.sh

上述DNVM安装以后,系统会将dnvm文件复制到C:\Program Files\Microsoft DNX\Dnvm目录,并将C:\Program Files\Microsoft DNX\Dnvm目录添加到环境变量中,以便全局都可以使用。注意:这里只是安装了DNVM,并没有安装任何版本的DNX,要安装DNX的话,可以通过运行dnvm或dnvm help来查找相关的命令,具体命令如下:

dnvm upgrade [-x86][-x64] [-svr50][-svrc50] [-g|-global] [-proxy <ADDRESS>]
  1. 从feed源安装最新版的DNX
  2. 为已安装的DNX设置一个默认(default)别名
  3. 将DNX bin添加的用户PATH环境变量中
  4. -g|-global 在全局内进行安装(其它用户也可以使用)
  5. -f|-force 强制更新成最新版(即便最新版已经安装过了)
  6. -proxy 访问远程服务器的时候使用特定的地址作为代理
dnvm install <semver>|<alias>|<nupkg>|latest [-x86][-x64] [-svr50][-svrc50] [-a|-alias <alias>] [-g|-global] [-f|-force]
  1. | 从feed源安装指定的DNX
  2. 从本地文件系统安装指定的DNX
  3. latest 从feed源安装最新版的DNX
  4. 将DNX bin添加到当前命令行的path环境变量中
  5. -p|-persistent 将DNX bin添加到系统PATH环境变量中
  6. -a|-alias 对指定安装的DNX设置别名
  7. -g|-global 在全局内进行安装
  8. -f|-force 强制安装指定的DNX(即便该版本已经安装过了)
dnvm use <semver>|<alias>|none [-x86][-x64] [-svr50][-svrc50] [-p|-persistent] [-g|-global]
  1. | 将DNX bin添加到当前命令行的path环境变量中
  2. none 将DNX bin从当前命令行的path环境变量中删除
  3. -p|-persistent 将DNX bin添加到系统PATH环境变量中
  4. -g|-global 组合使用-p将用户PATH修改成系统PATH
dnvm list //列出所有已安装的DNX版本
dnvm alias //列出所有定义了别名的DNX版本
dnvm alias <alias> // 显示定义了别名的DNX名称
dnvm alias <alias> <semver> [-x86][-x64] [-svr50][-svrc50] //给指定的DNX版本设置别名

管理程序集的dnu命令和feed源配置

通过dnu命令进行包管理的时候,通常使用如下命令:

dnu restore:查询程序的所有依赖包,并将其全部下载到packages目录,该命令会下载整个依赖包以及这些依赖包所依赖的其它依赖包。
dun install <package id>:该install命令用于下载指定的程序包并添加到程序中。
dun publish:该命令会将你的程序打包到一个可以运行的自包含目录中。其会创建如下目录结构:

    output/
    output/packages
    outpot/appName
    output/commandName.cmd
  1. packages目录包含所有应用程序需要的程序包。
  2. appName目录包含所有应用程序的代码,如果引用了其它项目,则在引用的其它项目也会创建各自项目的同级目录,即生成的目录会和AppName同级。
  3. publish命令,会将project.json中的commands节点中的各种命令,分别生成响应的命令行文件,如commands里的web命令,我们就可以通过dnx web(格式:dnx <command>)开运行它。

由于dnu在内部使用了Nuget命令,进行程序包的管理,所以使用的时候要正确配置Nuget的feed源,目前ASP.NET 5相关的包都在myget feed上,所以我们需要添加这个feed才能正常运行。这些配置信息在Windows下的%AppData%\NuGet\NuGet.config(或者*nix下Mono使用的~/.config/NuGet/NuGet.config)文件中进行管理。示例如下:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <packageSources>
    <add key="AspNetVNext" value="https://www.myget.org/F/aspnetvnext/api/v2/" />
    <add key="nuget.org" value="https://www.nuget.org/api/v2/" />
  </packageSources>
  <disabledPackageSources />
  <activePackageSource>
    <add key="nuget.org" value="https://www.nuget.org/api/v2/" />
  </activePackageSource>
</configuration>

在VS2015下,则可以直接通过Tools--> Options--> Nuget Package Manager--> Package Sources来设置,示例如下图:

另外需要注意一下,上述feed的地址是asp.net5的每日构建版本,如果你想使用稳定的里程碑版(如1.0.0_alpha4),则需要使用如下地址https://www.myget.org/F/aspnetmaster/api/v2/

Web Server支持

微软在实现DNX的时候提供了几种Web服务器支持,具体分别如下:

Microsoft.AspNet.Loader.IIS (Helios)

该服务器用于在IIS上加载ASP.NET5程序,以便和IIS进程集成,同时绕过了System.Web从而带来性能上的提升,可以支持Windows认证、静态文件访问等功能。其原理是将IIS与NDX之间做一个桥接。

Microsoft.AspNet.Server.WebListener (WebListener)

该服务器通过Microsoft.AspNet.Hosting在IIS之外加载程序、服务、work role等,它直接运行在Http.Sys核心驱动之上,仅消费少许性能,从中可以受益于端口共享,Windows认证等功能。

Microsoft.AspNet.Server.Kestrel (Kestrel)

该服务器通过Microsoft.AspNet.Server.Kestrel在IIS之外加载运行,其设计被用于跨平台的Web服务(Windows、Mac、Linux等等)。

参考内容

  1. https://github.com/aspnet/Home/wiki/DNX-structure
  2. https://github.com/aspnet/Home/wiki/Command-Line
  3. https://github.com/aspnet/Home/wiki/Version-Manager
  4. https://github.com/aspnet/Home/wiki/Package-Manager

同步与推荐

本文已同步至目录索引:解读ASP.NET 5 & MVC6系列

时间: 2024-12-31 22:49:18

解读ASP.NET 5 & MVC6系列(4):核心技术与环境配置的相关文章

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

原文:解读ASP.NET 5 & MVC6系列(3):项目发布与部署 本章我们将讲解ASP.NET5项目发布部署相关的内容,示例项目以我们前一章创建的BookStore项目为例. 发布前的设置 由于新版ASP.NET5支持多版本DNX运行环境的发布和部署,所以在部署之前,我们需要设定部署的目标DNX(即之前的KRE). 步骤:右键BookStore项目->属性->Application选项卡,选择DNX的版本,本例中,选择dnx-coreclr-win-x64.1.0.0-beta4.

解读ASP.NET 5 &amp; MVC6系列(2):初识项目

原文:解读ASP.NET 5 & MVC6系列(2):初识项目 初识项目 打开VS2015,创建Web项目,选择ASP.NET Web Application,在弹出的窗口里选择ASP.NET 5 Website模板创建项目,图示如下: 我们可以看到,此时Web Forms\MVC\Web API复选框都选择不了,原有是因为在ASP.NET 5中做了大量更改,移除了Web Forms功能,将MVC.Web API.Web Pages这些功能合在了一起,所以自然就不需要这些复选框了.另外由于是CT

解读ASP.NET 5 &amp; MVC6系列(11):Routing路由

原文:解读ASP.NET 5 & MVC6系列(11):Routing路由 新版Routing功能介绍 在ASP.NET 5和MVC6中,Routing功能被全部重写了,虽然用法有些类似,但和之前的Routing原理完全不太一样了,该Routing框架不仅可以支持MVC和Web API,还支持一般的ASP.NET5程序.新版的改变有如下几个部分. 首先,Routing系统是基于ASP.NET 5的,是一个独立于MVC的路由框架,而不是基于MVC的.MVC只是在上面扩展了一个快捷方式而已. 其次,

解读ASP.NET 5 &amp; MVC6系列(12):基于Lamda表达式的强类型Routing实现

原文:解读ASP.NET 5 & MVC6系列(12):基于Lamda表达式的强类型Routing实现 前面的深入理解Routing章节,我们讲到了在MVC中,除了使用默认的ASP.NET 5的路由注册方式,还可以使用基于Attribute的特性(Route和HttpXXX系列方法)来定义.本章,我们将讲述一种基于Lambda表达式的强类型类型. 这种方式的基本使用示例如下: services.Configure<MvcOptions>(opt => { opt.EnableTy

解读ASP.NET 5 &amp; MVC6系列(7):依赖注入

原文:解读ASP.NET 5 & MVC6系列(7):依赖注入 在前面的章节(Middleware章节)中,我们提到了依赖注入功能(Dependency Injection),ASP.NET 5正式将依赖注入进行了全功能的实现,以便开发人员能够开发更具弹性的组件程序,MVC6也利用了依赖注入的功能重新对Controller和View的服务注入功能进行了重新设计:未来的依赖注入功能还可能提供更多的API,所有如果还没有开始接触依赖注入的话,就得好好学一下了. 在之前版本的依赖注入功能里,依赖注入的

解读ASP.NET 5 &amp; MVC6系列(1):ASP.NET 5简介

原文:解读ASP.NET 5 & MVC6系列(1):ASP.NET 5简介 ASP.NET 5简介 ASP.NET 5是一个跨时代的改写,所有的功能和模块都进行了独立拆分,做到了彻底解耦.为了这些改写,微软也是蛮 拼的,几乎把.NET Framwrok全部改写了一遍,形成了一个.NET Core的东西. 在.NET Core里一切都是可配置的,包括Session.MVC等功能,而一切可配置的功能都是可以在Nuget上进行下载. 目前ASP.NET 5依旧兼容老的.NET Framwrok,但要

解读ASP.NET 5 &amp; MVC6系列(6):Middleware详解

原文:解读ASP.NET 5 & MVC6系列(6):Middleware详解 在第1章项目结构分析中,我们提到Startup.cs作为整个程序的入口点,等同于传统的Global.asax文件,即:用于初始化系统级的信息(例如,MVC中的路由配置).本章我们就来一一分析,在这里如何初始化这些系统级的信息. 新旧版本之间的Pipeline区别 ASP.NET 5和之前版本的最大区别是对HTTP Pipeline的全新重写,在之前的版本中,请求过滤器的通常是以HttpModule为模块组件,这些组件

解读ASP.NET 5 &amp; MVC6系列(8):Session与Caching

原文:解读ASP.NET 5 & MVC6系列(8):Session与Caching 在之前的版本中,Session存在于System.Web中,新版ASP.NET 5中由于不在依赖于System.Web.dll库了,所以相应的,Session也就成了ASP.NET 5中一个可配置的模块(middleware)了. 配置启用Session ASP.NET 5中的Session模块存在于Microsoft.AspNet.Session类库中,要启用Session,首先需要在project.json

解读ASP.NET 5 &amp; MVC6系列(5):Configuration配置信息管理

原文:解读ASP.NET 5 & MVC6系列(5):Configuration配置信息管理 在前面的章节中,我们知道新版的MVC程序抛弃了原来的web.config文件机制,取而代替的是config.json,今天我们就来深入研究一下配置文件的相关内容. 基本用法 新版的配置信息机制在Microsoft.Framework.ConfigurationModel命名空间下进行了重写,重写以后不仅支持XML格式,还支持json.ini.环境变量等.在模板示例程序中Startup类的构造函数内如,有