03、NetCore2.0下Web应用之搭建最小框架
这里我们不使用VS2017或者CLI命令的方式创建Asp.Net Core 2.0网页应用程序,而是完全手工的一点点搭建一个Web框架,以便更好的理解Asp.Net Core 2.0网页应用程序的最小脉络框架。
------------------------------------------------------------------------------------------------------------
写在前面:这是一个系列的文章,总目录请移步:NetCore2.0技术文章目录------------------------------------------------------------------------------------------------------------
一、创建一个干净的控制台程序
这里我们使用的开发工具是VS2017
![](https://images2017.cnblogs.com/blog/1223203/201708/1223203-20170822113233668-575831783.png)
项目只有一个Program.cs类。
![](https://images2017.cnblogs.com/blog/1223203/201708/1223203-20170822113259730-97660509.png)
二、让控制台程序可以响应Web请求
1.让控制台程序成为Web宿主,需要引用WebHost包
Microsoft.AspNetCore.Hosting
![](https://images2017.cnblogs.com/blog/1223203/201708/1223203-20170822113313168-1783069051.png)
2.我们不想用IIS作为服务器,可以使用Kestrel作为Web服务器
Microsoft.AspNetCore.Server.Kestrel
![](https://images2017.cnblogs.com/blog/1223203/201708/1223203-20170822113335886-500316465.png)
3.使用Nuget应必要包之后的项目结构
![](https://images2017.cnblogs.com/blog/1223203/201708/1223203-20170822113351339-1793890469.png)
4.指定Web服务器,并启动WebHost
在Main方法中加入如下代码
using Microsoft.AspNetCore.Hosting; namespace MyWeb { class Program { static void Main(string[] args) { var host = new WebHostBuilder() .UseKestrel() // 指定WebServer为Kestrel .UseStartup<Startup>() // 配置WebHost .Build(); host.Run(); // 启动WebHost } } }
注:UserXXX是现在很流行的用法,一般是底层提供了一个插件框架(依赖倒置DI),并约定了一些接口规范,上层根据需要实现这些接口规范,通过UseXXX的方式注册到插件框架中。参考:05、NetCore2.0插件框架之Web应用启动流程源码初窥
新建一个Startup类,用于配置WebHost
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.Logging; using Microsoft.AspNetCore.Http; namespace MyWeb { class Startup { public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { app.Run(c => { return c.Response.WriteAsync("Hello dotnet core."); }); } } }
5.启动我们这个干净的Web应用程序
![](https://images2017.cnblogs.com/blog/1223203/201708/1223203-20170822113645996-305359228.png)
6.访问网站
![](https://images2017.cnblogs.com/blog/1223203/201708/1223203-20170822113700246-1182446402.png)
7.让网站的响应能力强一点
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.Logging; using Microsoft.AspNetCore.Http; namespace MyWeb { class Startup { public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { app.Run(c => { var req = c.Request.Path.ToString().TrimStart('/'); var res = string.Empty; switch (req) { case "1": res = "one"; break; case "2": res = "two"; break; default: res = "none"; break; } var mtd = string.Empty; switch (c.Request.Method) { case "GET": mtd = "请求方式: get"; break; case "POST": mtd = "请求方式:post"; break; default: mtd = "请求方式:none"; break; } return c.Response.WriteAsync(res); }); } } }
效果如下:
![](https://images2017.cnblogs.com/blog/1223203/201708/1223203-20170822113757980-235810503.png)
至此,我们使用Asp.Net Core 2.0创建了一个最小架构的Web应用程序。MVC、WebAPI是在此基础上的更高层次的封装。
8.查看一下编译后的文件
8.查看一下编译后的文件