ASP.NET Core 运行原理剖析1:初始化WebApp模版并运行
之前两篇文章简析.NET Core 以及与 .NET Framework的关系和.NET Core的构成体系从总体上介绍.NET Core,接下来计划用一个系列对ASP.NET Core的运行原理进行剖析。
ASP.NET Core 是新一代的 ASP.NET,早期称为 ASP.NET vNext,并且在推出初期命名为ASP.NET 5,但随着 .NET Core 的成熟,以及 ASP.NET 5的命名会使得外界将它视为 ASP.NET 的升级版,但它其实是新一代从头开始打造的 ASP.NET 核心功能,因此微软宣布将它改为与 .NET Core 同步的名称,即 ASP.NET Core。
ASP.NET Core 可运行于 Windows 平台以及非 Windows 平台,如 Mac OSX 以及 Ubuntu Linux 操作系统,是 Microsoft 第一个具有跨平台能力的 Web 开发框架。
微软在一开始开发时就将 ASP.NET Core 开源,因此它也是开源项目的一员,由 .NET 基金会 (.NET Foundation) 所管理。
正式版的.NET Core已于今天发布(2016年6月27日),具体可看微软 .NET Core 1.0 正式发布下载
核心框架
ASP.NET Core 在 .NET Core 的基础上发展,目前规划的功能有:
ASP.NET Core MVC: ASP.NET Core MVC 提供了开发动态web站点的API,包括了WebPages 和 WebAPI ,最终可运行在IIS 或 自托管(self-hosted)的服务器中。
DependencyInjection: 包含了通用的依赖注入接口,用于在ASP.NET Core MVC中使用。
Entity Framework Core: 与之前版本的EntityFramework版本类似是一个轻量级的ORM框架,包括了Linq,POCO和Codefirst的支持。
ASP.NET Core Identity: 用于在ASP.NET Core web applications构建用户权限系统的框架,包括了membership、login等功能,同时也可以方便的扩展和自定义。
ASP.NET Core APP 创建与运行
一、安装the .NET Core SDK for Windows(Linux、MAC)
以Windows为例,(下载地址),
安装完成后可以用命令dotnet -v查看版本号。
C:\Users\stephen>dotnet -v
Telemetry is: Enabled
.NET Command Line Tools (1.0.0-preview1-002702)
Usage: dotnet [common-options] [command] [arguments]
二、命令行生成模版项目
开发一个webapp可以从零开始创建文件,也可以通过命令行生成一个空的项目模版,下面的代码用于从零开始创建模版。
mkdir aspnetcoreapp
cd aspnetcoreapp
dotnet new
依次执行命令后,便可在当前路径下,生成模版。

模版包括以下三个文件:
- project.json:
主掌项目的运行期的配置设置,包含项目的包参考 (Package References)、项目的基本设置、引导指令、包含或排除指定目录、以及建造时的相关事件指令等。
- Program.cs:
程序入口文件
- project.lock.json:
与project.json相比,是project.json文件中引用包的完整引用列表。
三、修改project.json
project.json是用于定义项目需要依赖的资源,每个WebApp 需要一个hosting 程序(IIS、IISExpress等),而此次使用Kestrel (什么是kestrel?),在project.json中加入对Kestrel的依赖代码清单如下。
"dependencies": {
"Microsoft.NETCore.App": {
"type": "platform",
"version": "1.0.0-rc2-3002702"
},
"Microsoft.AspNetCore.Server.Kestrel": "1.0.0-rc2-final"
},
四、下载依赖包部署网站
在WebApp部署时(dotnet restore)根据project.json的依赖文件,依靠nuget下载依赖包,完成对整个程序的restore。(类似于Nodejs的 npm restore)
在C:\Users\stephen\.nuget\packages可以看到nuget已经下载到本地的包,在开始部署前nuget是不会加载依赖包,下图可看到目前nuget并没有下载任何包。

然后执行命令
dotnet restore
可以看到,nuget已经自动将需要依赖包下载到本地

五、添加Startup.cs文件
对于一个ASP.NET Core 程序而言,Startup Class 是必须的。ASP.NET Core在程序启动时会从assemblies中找到名字叫Startup的类,如果存在多个名为Startup的类,则会先找到项目根名称空间下的Startup类。
在Startup必须定义Configure方法,而configureServices方法则是可选的,方法会在程序第一次启动时被调用,类似传统的ASP.NET MVC的路由和应用程序状态均可在Startup中配置,也可以在此安装所需中间件等等。Startup的详细功能的对于startup.cs中的configure和configureServices方法会在后续文章中详解。
在刚才文件路径下添加Startup.cs文件,并复制如下代码:
using System;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
namespace aspnetcoreapp
{
public class Startup
{
public void Configure(IApplicationBuilder app)
{
app.Run(context =>
{
return context.Response.WriteAsync("Hello from ASP.NET Core!");
});
}
}
}
六、Web Hosting 配置
在Program.cs文件中复制如下代码,指定WebApp宿主程序为Kestrel:
using System;
using Microsoft.AspNetCore.Hosting;
namespace aspnetcoreapp
{
public class Program
{
public static void Main(string[] args)
{
var host = new WebHostBuilder()
.UseKestrel()
.UseStartup<Startup>()
.Build();
host.Run();
}
}
}
七、编译
dotnet build
代码完成后,需要调用Roslyn编译器将代码编译为assemblies,存储至bin文件夹中。按照上一节所述(简析 .NET Core 构成体系),
ASP.NET Core App 可以编译为IL的assemblies外,还可以通过native直接编译为机器码。

八、启动
输入启动命令,Kestrel托管WEB程序,并在5000端口监听,至此整个程序启动起来。
dotnet run


总结
本节介绍了ASP.NET Core 项目从创建、配置、编译、发布、运行的过程,ASP.NET Core与之前的ASP.NET相比具有更高的透明度和灵活性,可以快速的在各个操作系统中开发与运行。
本节使用Windows操作系统,但目前微软也在 linux 和 mac 下提供了类似的命令行工具(链接地址),方便在 linux 和 mac 下开发与部署,在后面文章中会详细讲解,本节不再累述。
参考链接
【1】 https://docs.asp.net/en/1.0.0-rc2/getting-started.html
ASP.NET Core 运行原理剖析1:初始化WebApp模版并运行的更多相关文章
- WebApp模版并运行
WebApp模版并运行 ASP.NET Core 运行原理剖析1:初始化WebApp模版并运行 核心框架 ASP.NET Core APP 创建与运行 总结 之前两篇文章简析.NET Core 以及与 ...
- ASP.NET Core 运行原理剖析2:Startup 和 Middleware(中间件)
ASP.NET Core 运行原理剖析2:Startup 和 Middleware(中间件) Startup Class 1.Startup Constructor(构造函数) 2.Configure ...
- ASP.NET Core 运行原理剖析
1. ASP.NET Core 运行原理剖析 1.1. 概述 1.2. 文件配置 1.2.1. Starup文件配置 Configure ConfigureServices 1.2.2. appset ...
- ASP.NET Core管道深度剖析(2):创建一个“迷你版”的管道来模拟真实管道请求处理流程
从<ASP.NET Core管道深度剖析(1):采用管道处理HTTP请求>我们知道ASP.NET Core请求处理管道由一个服务器和一组有序的中间件组成,所以从总体设计来讲是非常简单的,但 ...
- 从零开始实现ASP.NET Core MVC的插件式开发(三) - 如何在运行时启用组件
标题:从零开始实现ASP.NET Core MVC的插件式开发(三) - 如何在运行时启用组件 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p/112 ...
- ASP.NET Core 运行原理剖析 (转载)
1.1. 概述 在ASP.NET Core之前,ASP.NET Framework应用程序由IIS加载.Web应用程序的入口点由InetMgr.exe创建并调用托管.以初始化过程中触发HttpAppl ...
- ASP.NET Core管道深度剖析(3):管道是如何处理HTTP请求的?
我们知道ASP.NET Core请求处理管道由一个服务器和一组有序的中间件组成,所以从总体设计来讲是非常简单的,但是就具体的实现来说,由于其中涉及很多对象的交互,我想很少人能够地把它弄清楚.为了让读者 ...
- ASP.NET Core管道深度剖析
ASP.NET管道 以IIS 6.0为例,在工作进程w3wp.exe中,利用Aspnet_ispai.dll加载.NET运行时(如果.NET运行时尚未加载).IIS 6引入了应用程序池的概念,一个工作 ...
- 学习ASP.NET Core Blazor编程系列六——初始化数据
学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...
随机推荐
- ajax的使用:例题、ajax的数据处理
需要注意的是,调用的封装的数据库,和jQuery的保存地址 一.注册 (1)写文本框来进行用户名的验证 <input type="text" id="uid&quo ...
- 学习nodejs有感
接触nodejs一段时间了,不断的去接触接触,nodejs是一个能让前端程序员做后台开发的一项技术. 随着学习,让我更好的理解了前后端,以及浏览器是如何运作的
- 【转】Linux C动态内存泄漏追踪方法
原文:http://www.cnblogs.com/san-fu-su/p/5737984.html C里面没有垃圾回收机制,有时候你申请了动态内存却忘记释放,这就尴尬了(你的程序扮演了强盗角色,有借 ...
- IOS入门之Swift语言(一)
经过不断的努力,小哥也买了台苹果设备,终于可以开始我的IOS之旅了,说来确实令人苦恼,为了学习IOS我这着贫农阶级,省了几个月的零花钱,外加向亲朋好友求救,最终痛下心扉,卖了台MAC pro128G版 ...
- Android探索之BroadcastReceiver具体使用以及安全性探究
前言: 最近的计划是学习一下iOS的NSNotificationCenter,突然想起来的Android的广播机制,所以还是觉得先对BroadcastReceiver来个全面的总结然后再去学习NSNo ...
- iOS开发之遍历Model类的属性并完善使用Runtime给Model类赋值
在上篇博客<iOS开发之使用Runtime给Model类赋值>中介绍了如何使用运行时在实体类的基类中添加给实体类的属性赋值的方法,这个方法的前提是字典的Key必须和实体类的Property ...
- 程序员眼中的 SQL Server-非聚集索引能给我们带来什么?
写在前面 最近在做的一个项目,页面访问的时候很慢(大概几秒钟的样子),然后用日志记录的方式,来排查这个问题,最后发现是 Entity Framework 初始化的一个坑(大概要花 6-7 秒),详见: ...
- Oracle Recovery 02 - 常规恢复之不完全恢复
背景:这里提到的常规恢复指的是数据库有完备可用的RMAN物理备份. 实验环境:RHEL6.4 + Oracle 11.2.0.4 单实例. 二.常规恢复之不完全恢复:部分数据丢失 2.1 重做日志文件 ...
- 三步将Node应用部署到Heroku上
Heroku是一个提供快速部署服务的云平台.支持Node,Ruby,Java,PHP,Python,Go多种语言,今天体验了下,简直不要太爽.下面简单的介绍一下. 首先还是要注册一个账号:https: ...
- Android APP压力测试(二)之Monkey信息自动收集脚本
Android APP压力测试(二) 之Monkey信息自动收集脚本 前言: 上一篇Monkey介绍基本搬抄官方介绍,主要是为了自己查阅方便.本文重点介绍我在进行Monkey时如何自动收集相关信息 ...