课程链接:http://video.jessetalk.cn/course/explore

良心课程,大家一起来学习哈!

任务22:课程介绍

  • 1.HTTP 处理过程
  • 2.WebHost 的配置与启动
  • 3.Middleware 与管道
  • 4.Routing MiddleWare 介绍

任务23:Http请求的处理过程

任务24:WebHost的配置

  • 1.覆盖配置文件
  • 2.更改启动URL
  • 3.IHostingEnvironment
  • 4.IApplicationLifetime
  • 5.dotnet watch run
dotnet new web

settings.json

{
"ConnectionStrings":{
"DefaultConnection":"Server=...;Database=...;"
}
}

Program.cs

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration(configureDelegate=>{
configureDelegate.AddJsonFile("settings.json");
})
.UseStartup<Startup>();

Startup.cs

using Microsoft.Extensions.Configuration;

public void Configure(IApplicationBuilder app, IHostingEnvironment env, IConfiguration configuration)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
} app.Run(async (context) =>
{
// await context.Response.WriteAsync("Hello World!");
// JsonFile
await context.Response.WriteAsync(configuration["ConnectionStrings:DefaultConnection"]);
});
}

启动HelloCore,输出结果

Program.cs

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration(configureDelegate => {
//configureDelegate.AddJsonFile("settings.json");
configureDelegate.AddCommandLine(args);
})
//.UseUrls("http://localhost:5001")
.UseStartup<Startup>();

Startup.cs

            app.Run(async (context) =>
{
// await context.Response.WriteAsync("Hello World!");
// JsonFile
//await context.Response.WriteAsync(configuration["ConnectionStrings:DefaultConnection"]);
// CommandLine
await context.Response.WriteAsync($"name={configuration["name"]}");
});

设置应用程序参数

启动HelloCore,输出结果

任务25:IHostEnvironment和 IApplicationLifetime介绍

Startup.cs

app.Run(async (context) =>
{
await context.Response.WriteAsync($"ContentRootPath = {env.ContentRootPath}");
await context.Response.WriteAsync($"EnvironmentName = {env.EnvironmentName}");
await context.Response.WriteAsync($"WebRootPath = {env.WebRootPath}");
});

启动HelloCore,输出结果

Startup.cs

        public void Configure(IApplicationBuilder app, IHostingEnvironment env, IConfiguration configuration, IApplicationLifetime applicationLifetime)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
} applicationLifetime.ApplicationStarted.Register(() =>
{
Console.WriteLine("Started");
}); applicationLifetime.ApplicationStopped.Register(() =>
{
Console.WriteLine("Stopped");
}); applicationLifetime.ApplicationStopped.Register(() =>
{
Console.WriteLine("Stopped");
}); app.Run(async (context) =>
{
await context.Response.WriteAsync($"ContentRootPath = {env.ContentRootPath}");
await context.Response.WriteAsync($"EnvironmentName = {env.EnvironmentName}");
await context.Response.WriteAsync($"WebRootPath = {env.WebRootPath}");
});
}

启动HelloCore,输出结果

我心中的ASP.NET Core 新核心对象WebHost(一):

http://www.jessetalk.cn/2017/11/11/aspnet-core-object-webhost/#comment-194

我心中的ASP.NET Core 新核心对象WebHost(二):

http://www.jessetalk.cn/2017/11/14/aspnet-core-object-webhost-build/

任务26:dotnet watch run 和attach到进程调试

New Terminal

dotnet new web --name HelloCore

F5 Start Debug

在csproj 的 ItemGroup 添加引用

<DotNetCliToolReference Include="Microsoft.DotNet.Watcher.Tools" Version="2.0.0" />

New Terminal

dotnet restore
dotnet watch run

修改代码保存后会自动重启

浏览器刷新即可看到更新结果

attach到进程调试

任务27:Middleware管道介绍

  • 1.Middleware 与管道的概念
  • 2.用 Middleware 来组成管道实践
  • 3.管道的实现机制(RequestDelegate 与 ApplicationBuilder)

startup.cs

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
} // 添加一个中间件,传一个名字为next的request delegate
app.Use(async (context,next)=>{
await context.Response.WriteAsync("1: before start...");
await next.Invoke();
}); // 接收一个RequestDelegate,返回一个RequestDelegate
app.Use(next=>{
return (context)=>{
context.Response.WriteAsync("2: in the middle of start..");
return next(context);
};
}); app.Run(async (context) =>
{
await context.Response.WriteAsync("3: start...");
});
}

启动项目,输出结果

// 如果不调用next,则管道终止,不会输出"3: start..."
app.Use(next=>{
return (context)=>{
return context.Response.WriteAsync("2: in the middle of start..");
//return next(context);
};
});

        // 使用Map构建路由,通过localhost:5000/task访问
app.Map("/task", taskApp=>{
taskApp.Run(async context=>{
await context.Response.WriteAsync("this is a task");
});
}); // 添加一个中间件,传一个名字为next的request delegate
app.Use(async (context,next)=>{
await context.Response.WriteAsync("1: before start...");
await next.Invoke();
}); // 接收一个RequestDelegate,返回一个RequestDelegate
// 如果不调用next,则管道终止,不会输出"3: start..."
app.Use(next=>{
return (context)=>{
context.Response.WriteAsync("2: in the middle of start..");
return next(context);
};
}); app.Run(async (context) =>
{
await context.Response.WriteAsync("3: start...");
});

访问 https://localhost:5001/task

任务28:RequestDelegate管道实现思路

  • 1.RequestDelegate
  • 2.ApplicationBuilder:多个RequestDelegate拼接
// 添加一个中间件,传一个名字为next的RequestDelegate
app.Use(async (context,next)=>{
await context.Response.WriteAsync("1: before start...");// 完成自己处理
await next.Invoke();// 调用下一步
}); // 封装一个function交给ApplicationBuilder处理
app.Use(next=>{
return (context)=>{
context.Response.WriteAsync("2: in the middle of start..");
return next(context);
};
});

任务29:自己动手构建RequestDelegate管道

新建一个控制台程序

dotnet new console --name MyPipeline

新建一个类RequestDelegate.cs

using System;
using System.Threading.Tasks; namespace MyPipeline
{
public delegate Task RequestDelegate(Context context);
}

新建一个类Context.cs

using System;
using System.Threading.Tasks; namespace MyPipeline
{
public class Context
{ }
}
using System;
using System.Collections.Generic;
using System.Threading.Tasks; namespace MyPipeline
{
class Program
{
public static List<Func<RequestDelegate,RequestDelegate>>
_list = new List<Func<RequestDelegate, RequestDelegate>>();
static void Main(string[] args)
{
Use(next=>{
return context=>{
Console.WriteLine("1");
return next.Invoke(context);
};
}); Use(next=>{
return context=>{
Console.WriteLine("2");
return next.Invoke(context);
};
}); RequestDelegate end = (Context)=>{
Console.WriteLine("end...");
return Task.CompletedTask;
}; _list.Reverse();
foreach(var middleware in _list)
{
end = middleware.Invoke(end);
} end.Invoke(new Context());
Console.ReadLine();
} public static void Use(Func<RequestDelegate,RequestDelegate> middleware)
{
_list.Add(middleware);
}
}
}

在任何一个Middleware可以结束管道

            Use(next=>{
return context=>{
Console.WriteLine("1");
//return next.Invoke(context);
return Task.CompletedTask;// 结束管道调用,只输出1
};
});

任务30:RoutingMiddleware介绍以及MVC引入

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.DependencyInjection; namespace HelloCore
{
public class Startup
{
// This method gets called by the runtime. Use this method to add services to the container.
// For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
public void ConfigureServices(IServiceCollection services)
{
services.AddRouting();// 添加依赖注入配置
} // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
} if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
} // 通过localhost:5000/action访问
app.UseRouter(builder=>builder.MapGet("action", async context=>{
await context.Response.WriteAsync("this is a action");
})); // 使用Map构建路由,通过localhost:5000/task访问
app.Map("/task", taskApp=>{
taskApp.Run(async context=>{
await context.Response.WriteAsync("this is a task");
});
}); // 添加一个中间件,传一个名字为next的request delegate
app.Use(async (context,next)=>{
await context.Response.WriteAsync("1: before start...");
await next.Invoke();
}); // 如果不调用next,则管道终止,不会输出"3: start..."
app.Use(next=>{
return (context)=>{
return context.Response.WriteAsync("2: in the middle of start..");
//return next(context);
};
}); app.Run(async (context) =>
{
await context.Response.WriteAsync("3: start...");
});
}
}
}

访问 https://localhost:5001/action

使用UseRouter方法2

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.DependencyInjection; namespace HelloCore
{
public class Startup
{
// This method gets called by the runtime. Use this method to add services to the container.
// For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
public void ConfigureServices(IServiceCollection services)
{
services.AddRouting();// 添加依赖注入配置
} // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
} if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
} // 使用UseRouter方法2
// 通过localhost:5000/action访问
RequestDelegate handler = context=>context.Response.WriteAsync("this is a action");
var route = new Route(
new RouteHandler(handler),
"action",
app.ApplicationServices.GetRequiredService<IInlineConstraintResolver>()
); app.UseRouter(route); // 使用UseRouter方法1
// 通过localhost:5000/action访问
app.UseRouter(builder=>builder.MapGet("action", async context=>{
await context.Response.WriteAsync("this is a action");
})); // 使用Map构建路由,通过localhost:5000/task访问
app.Map("/task", taskApp=>{
taskApp.Run(async context=>{
await context.Response.WriteAsync("this is a task");
});
}); // 添加一个中间件,传一个名字为next的request delegate
app.Use(async (context,next)=>{
await context.Response.WriteAsync("1: before start...");
await next.Invoke();
}); // 如果不调用next,则管道终止,不会输出"3: start..."
app.Use(next=>{
return (context)=>{
return context.Response.WriteAsync("2: in the middle of start..");
//return next(context);
};
}); app.Run(async (context) =>
{
await context.Response.WriteAsync("3: start...");
});
}
}
}

访问 https://localhost:5001/action

RountingMiddleware介绍

var routeHandler = new RouteHandler(context=>context.Response.WriteAsync("test"));

var route = new Route(routeHandler);

new RouteMiddleware(route)

RouteMiddleware.Invoke(httpContext)

_route.RouteAsync(context)

routeMatch(RouteContext)

OnRouteMatched(RouteContext)

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

欢迎转载、使用、重新发布,但务必保留文章署名 郑子铭 (包含链接: http://www.cnblogs.com/MingsonZheng/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。

如有任何疑问,请与我联系 (MingsonZheng@outlook.com) 。

ASP.NET Core快速入门(第4章:ASP.NET Core HTTP介绍)--学习笔记的更多相关文章

  1. ASP.NET Core 快速入门(Razor Pages + Entity Framework Core)

    引子 自从 2009 年开始在博客园写文章,这是目前我写的最长的一篇文章了. 前前后后,我总共花了 5 天的时间,每天超过 3 小时不间断写作和代码调试.总共有 8 篇文章,每篇 5~6 个小结,总截 ...

  2. ASP.NET Core快速入门--学习笔记系列文章索引目录

    课程链接:http://video.jessetalk.cn/course/explore 良心课程,大家一起来学习哈! 抓住国庆假期的尾巴完成了此系列课程的学习笔记输出! ASP.NET Core快 ...

  3. 【笔记目录2】【jessetalk 】ASP.NET Core快速入门_学习笔记汇总

    当前标签: ASP.NET Core快速入门 共2页: 上一页 1 2  任务27:Middleware管道介绍 GASA 2019-02-12 20:07 阅读:15 评论:0 任务26:dotne ...

  4. 【笔记目录1】【jessetalk 】ASP.NET Core快速入门_学习笔记汇总

    当前标签: ASP.NET Core快速入门 共2页: 1 2 下一页  任务50:Identity MVC:DbContextSeed初始化 GASA 2019-03-02 14:09 阅读:16 ...

  5. 【第三篇】ASP.NET MVC快速入门之安全策略(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  6. 【第一篇】ASP.NET MVC快速入门之数据库操作(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  7. .NET Core 快速入门教程

    .NET Core 快速学习.入门系列教程.这个入门系列教程主要跟大家聊聊.NET Core的前世今生,以及Windows.Linux(CentOS.Ubuntu)基础开发环境的搭建.第一个.NET ...

  8. .NET Core快速入门教程 2、我的第一个.NET Core App(Windows篇)

    一.前言 本篇开发环境?1.操作系统: Windows 10 X642.SDK: .NET Core 2.0 Preview 二.安装 .NET Core SDK 1.下载 .NET Core下载地址 ...

  9. .NET Core快速入门教程 3、我的第一个.NET Core App (CentOS篇)

    一.前言 本篇开发环境?1.操作系统:CentOS7(因为ken比较偏爱CentOS7)2.SDK版本:.NET Core 2.0 Preview 你可能需要的前置知识1.了解如何通过Hyper-V安 ...

  10. 【第二篇】ASP.NET MVC快速入门之数据注解(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

随机推荐

  1. Java之线程与进程

    一.线程与进程 线程:一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务.多线程是多任务的一种特别形式,但多线程使用了更小的资源开销. 进程:一个进程包括 ...

  2. emacs 缩进

    emacs提供一些编码风格,可以使用M-x c-set-style来选择你喜欢的编码风格. Possible completions are: awk bsd cc-mode ellemtel gnu ...

  3. openresty配置

    目录 环境 wsl安装 openresty安装 openssl版本问题 Lua模块安装 openresty使用 nginx常用命令 nginx.conf 配置 lua 的一些坑 OpenResty缓存 ...

  4. STM32HAL快速上手

    STM32HAL快速上手 资料下载 如果在下面的网站中没有账户,建议用edu邮箱创建账户. STMicroeletronic 意法半导体官网 首页 - STMicroelectronics 意法半导体 ...

  5. IAR调试查看程序时间

    在无仿真器情况下设置: 调试仿真,点击view菜单下registers 软件仿真时计算两断点CYCLECOUNTER(在CPU registers中)的差值,乘以指令周期(MCLK)便是执行时间

  6. K8S 1.14.6中,将kubeadm集群证书颁发时间延长到100年

    更改两个文件,重新编译kubeadm. 1,D:\kubernetes-1.14.6\staging\src\k8s.io\client-go\util\cert\cert.go // NewSelf ...

  7. Onenote添加代码

    使用Onenote做笔记的时候,是没有直接插入代码的,但是如果可以插入的话很方便. 这个是我找的一个参考,照这个来就行. 参考链接: https://www.cnblogs.com/two-peanu ...

  8. pwn-Stack Overflow

    地址 https://cgctf.nuptsast.com/challenges#Pwn 先观察一下,是一个32位的程序,而且只开了NX保护 用IDA看看伪代码,重点在message和pwnme这两个 ...

  9. python3.5.3rc1学习八:文件打包

    from cx_Freeze import setup, Executable setup(name='test to exe', version = '0.1', description='test ...

  10. C++ class 内的 [] 重载示例。

    #include <iostream> // overloading "operator [] " inside class ///////////////////// ...