课程链接: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. wpf datagrid field to image converter 字段 图片转化器

    <DataGridTemplateColumn Header="Binding"> <DataGridTemplateColumn.CellTemplate> ...

  2. 创建WPF项目

    参考: https://www.cnblogs.com/yhcao/p/6237611.html https://mahapps.com/guides/reporting-issues.html ht ...

  3. .NET MVC5简介(五)管道处理模型IHttpModule

    https://www.cnblogs.com/JimmyZhang/archive/2007/09/04/880967.html IHttpModule HTTPRuntime(运行时).在一个控制 ...

  4. 【LeetCode】2. 两数相加

    题目 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字.   如果,我们将这两个数相加起来,则会返回一个新的链表来表 ...

  5. 用Python查找数组中出现奇数次的那个数字

    有一个数组,其中的数都是以偶数次的形式出现,只有一个数出现的次数为奇数次,要求找出这个出现次数为奇数次的数. 集合+统计 解题思路 最简单能想到的,效率不高.利用集合的特性,通过 Python 的 s ...

  6. Java性能 -- Lock优化

    Lock / synchronized Lock锁的基本操作是通过乐观锁实现的,由于Lock锁也会在阻塞时被挂起,依然属于悲观锁   synchronized Lock 实现方式 JVM层实现 Jav ...

  7. 装上这 10 个插件,你就是这条 Gai 最靓的仔!

    直奔主题,给大家推荐 10 个好用的插件. 1.「Adblock Plus」 世界排名第一的免费广告拦截程序 ​ 相信大家都有这样的体验,进某个论坛.新闻或者购物网站,广告满天飞,关掉之后还时不时弹出 ...

  8. [转]Doing more with Outlook filter and SQL DASL syntax

    本文转自:https://blogs.msdn.microsoft.com/andrewdelin/2005/05/10/doing-more-with-outlook-filter-and-sql- ...

  9. 1.JavaCC安装与测试

      下面介绍的是JavaCC在windows系统中的安装与小代码测试过程. 一.JavaCC安装   步骤 :在JavaCC的官网首页下载JavaCC,然后配置电脑的环境变量,接着在dos命令行里就可 ...

  10. BayaiM__oracle切换归档模式步骤:

    BayaiM__oracle切换归档模式(步骤): ------------------oracle11g设置归档模式和非归档模式--------------------------[root@tes ...