这里有新鲜出炉的精品教程, 程序狗速度看过来!
ASP.NET
ASP.NET 是. NET FrameWork 的一部分, 是一项微软公司的技术, 是一种使嵌入网页中的脚本可由因特网服务器执行的服务器端脚本技术, 它可以在通过 HTTP 请求文档时再在 web 服务器上动态创建它们 指 Active Server Pages(动态服务器页面) , 运行于 IIS(Internet Information Server 服务, 是 Windows 开发的 Web 服务器)之中的程序
这篇文章主要介绍了 ASP.NET 5 核心技术与环境配置, 需要的朋友可以参考下
asp.net 5 是下一代的 asp.net, 该版本进行了全部重写以适用于跨平台, 新新版本中, 微软引入了如下工具与命令: DNVMDNXDNU
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 程序运行的核心, 其遵循如下两个准则:
DNX 应该是自包含的, DNX 在解析完应用程序依赖树以后才能知道要使用哪个 Core CLR 包, 所以在得到解析树之前, DNX 是无法加载任何 CLR 的, 但 Roslyn 编译器除外依赖注入 (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 版本, 该层有如下两个职责:
启动 CLR, 启动哪个 CLR 取决于你选择的 CLR 版本如果是 Core CLR, 该层会加载 coreclr.dll, 配置并启动运行环境, 然后创建应用程序域 (AppDomain), 以便运行所有的托管代码调用托管代码的入口点(Layer 2), 一旦 Native Host 的入口点返回了该线程, 就会把 CLR 的线程清理干净并关闭, 比如, 卸载应用程序域(AppDomain) 并停止运行环境
Layer 2:Managed Entry Point
Layer 2 层 (托管代码入口) 是编写托管代码的第一层, 其职责如下:
创建 LoaderContainer(其包含需要的 ILoaders),ILoader 负责根据程序集的名称来加载程序集 CLR 需要一个程序集的话, LoaderContainer 就会使用其 ILoader 来解析所需要的程序集从 --lib 的路径目录下, 用根 ILoader 来加载程序集, 并解析其依赖调用程序的主入口点
Layer 3:Application host/Application
如果开发人员将整个程序编译成程序集放在 libpath 目录下, 那该层就是你的应用程序了使用的时候, 将含有程序入口点的程序集名称作为 [ProgramName] 的参数传入即可, Layer 2 层会直接调用该程序集
不过, 一般其它情况下, 都会使用一个应用程序宿主 (Application host) 来解析程序的依赖内容并启动运行程序
Microsoft.Net.ApplicationHost
是运行环境提供的应用程序宿主, 并拥有如下职责:
解析 project.json 里定义的各种依赖程序集将一个 ILoader 添加到 LoaderContainer, 以便从各种地方 (如源代码 NuGetRoslyn 等) 加载相应的程序集调用程序集的入口点, 将其作为下一个参数, 传递给 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 服务(WindowsMacLinux 等等)
参考内容
- https://github.com/aspnet/Home/wiki/DNX-structure
- https://github.com/aspnet/Home/wiki/Command-Line
- https://github.com/aspnet/Home/wiki/Version-Manager
- https://github.com/aspnet/Home/wiki/Package-Manager
来源: http://www.phperz.com/article/18/0312/352688.html