[理解ASP.NET Core框架]一个五十行的控制台Web
在阅读了Artech的ASP.NET Core管道深度剖析(2):创建一个“迷你版”的管道来模拟真实管道请求处理流程之后, 自己做了一个"迷你版"中的"迷你版", 对于理解中间件和HttpServer之间的关系很有帮助, 现在贴出代码如下:
/// <summary>
/// 使用控制台实现WebAppi - 简单版 - 目标: 实现一个监听 Http 的 Server, 一个连续的 Middleware
/// </summary>
public class Program
{
/// <summary>
/// 服务集合的容器: 服务类别1. 监听 Http 的 Server 服务类别2. 中间件集合
/// </summary>
/// <param name="args"></param>
public static void Main(string[] args)
{
// 用于监听Http
var listener = new HttpListener();
listener.Prefixes.Add("http://localhost:6688/");
listener.Start();
// 用于访问HttpListener的HttpRequest和HttpResponse
HttpListenerContext c = listener.GetContext(); // 定义一个中间件
Func<Func<HttpListenerContext, Task>, Func<HttpListenerContext, Task>> middleware1 = next =>
{
return context =>
{
string content = "<html><body><h1>Hello World!</h1></body></html>";
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(content);
context.Response.ContentEncoding = System.Text.Encoding.UTF8;
//c.Response.ContentLength64 = buffer.Length; // 这里赋值的话会出的问题: 1. 一旦填充到指定的长度, 立即将response响应, 释放资源 2. 如果最终都没有到达指定的长度, 不允许释放response, 抛出异常 // 所以, 不赋值, 让他最终自动生成就行了
context.Response.ContentType = "text/html";
context.Response.OutputStream.Write(buffer, , buffer.Length);
return next(context);
};
}; // 定义另一个中间件
Func<Func<HttpListenerContext, Task>, Func<HttpListenerContext, Task>> middleware2 = next =>
{
return context =>
{
string content = "<script>alert('Hello World')</script>";
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(content);
c.Response.OutputStream.Write(buffer, , buffer.Length);
return next(context);
};
};
var task = middleware1(middleware2(cc => Task.Delay()))(c);
task.Wait();
c.Response.Close(); // 将响应发送給客户端, 释放response的资源
listener.Stop(); // 使实例停止接收客户端请求
}
}

运行以后直接在浏览器输入localhost:6688即可, GitHub地址为: https://github.com/HeabKing/DotNetCoreStudy
[理解ASP.NET Core框架]一个五十行的控制台Web的更多相关文章
- 200行代码,7个对象——让你了解ASP.NET Core框架的本质
2019年1月19日,微软技术(苏州)俱乐部成立,我受邀在成立大会上作了一个名为<ASP.NET Core框架揭秘>的分享.在此次分享中,我按照ASP.NET Core自身的运行原理和设计 ...
- 了解ASP.NET Core框架的本质
了解ASP.NET Core框架的本质 ASP.NET Core自身的运行原理和设计思想创建了一个 “迷你版” 的ASP.NET Core框架,并且利用这个 “极简” 的模拟框架阐述了ASP.NET ...
- 200行代码,7个对象——让你了解ASP.NET Core框架的本质
原文:200行代码,7个对象--让你了解ASP.NET Core框架的本质 2019年1月19日,微软技术(苏州)俱乐部成立,我受邀在成立大会上作了一个名为<ASP.NET Core框架揭秘&g ...
- ASP.NET Core框架的本质
源文章地址:http://www.cnblogs.com/artech/p/inside-asp-net-core-framework.html 1.从Hello World谈起 当我们最开始学习一门 ...
- ASP.NET Core框架深度学习(一) Hello World
对于学习Core的框架,对我帮助最大的一篇文章是Artech的<200行代码,7个对象——让你了解ASP.NET Core框架的本质>,最近我又重新阅读了一遍该文.本系列文章就是结合我的阅 ...
- WPF中的常用布局 栈的实现 一个关于素数的神奇性质 C# defualt关键字默认值用法 接口通俗理解 C# Json序列化和反序列化 ASP.NET CORE系列【五】webapi整理以及RESTful风格化
WPF中的常用布局 一 写在开头1.1 写在开头微软是一家伟大的公司.评价一门技术的好坏得看具体的需求,没有哪门技术是面面俱到地好,应该抛弃对微软和微软的技术的偏见. 1.2 本文内容本文主要内容 ...
- 一个Mini的ASP.NET Core框架的实现
一.ASP.NET Core Mini 在2019年1月的微软技术(苏州)俱乐部成立大会上,蒋金楠老师(大内老A)分享了一个名为“ASP.NET Core框架揭秘”的课程,他用不到200行的代码实现了 ...
- 用一个应用场景理解ASP.NET Core Identity是什么?
目录 前言 基于声明的认证(Claims-based Authentication) 应用场景一 在ASP.NET Core 中Identity是如何实现的 类ClaimsPrincipal 考察另外 ...
- ASP.NET Core 框架本质学习
本文作为学习过程中的一个记录. 学习文章地址: https://www.cnblogs.com/artech/p/inside-asp-net-core-framework.html 一. ASP.N ...
随机推荐
- js中test,exec和match方法
test test 返回 Boolean,查找对应的字符串中是否存在模式. var str = "1a1b1c";var reg = new RegExp("1.&quo ...
- Google Chrome中的高性能网络(二)
Chrome Predictor的预测功能优化 Chrome会随着使用变得更快. 它这个特性是通过一个单例对象Predictor来实现的.这个对象在浏览器内核进程(Browser Kernel Pro ...
- zookeeper服务器端管理工具
zookeeper基本是基于API和console进行znode的操作,并没有一个比较方便的操作界面,这里也发现了taobao 伯岩写的一个工具,可以比较方便的查询zookeeper信息. 工具的开发 ...
- GTK+中的构件II(Widgets)
GTK+中的构件II(Widgets) GTK+中的构件II(Widgets) 在本章的GTK+程序设计中,我们仍然要继续向大家介绍和展示各种各样的构件. GtkComboBox GtkComboBo ...
- 五指CMS开发日志(一)
开发了这么长时间,基本功能已经具备了.分享一下后台的界面吧.
- JUnit学习总结
Junit简介: Junit最初是由Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework),为单元测试(Unit Test) ...
- 在VirtualBox中安装了Ubuntu后,Ubuntu的屏幕分辨率非常小,操作非常不便。通过安装VirtualBox提供的“增强功能组件”,-摘自网络
在VirtualBox中安装了Ubuntu后,Ubuntu的屏幕分辨率非常小,操作非常不便.通过安装VirtualBox提供的“增强功能组件”,可以解决这一问题,并且使用非常方便. 一.环境 | En ...
- WPF线程获取UI线程
WPF中只能是UI线程才可以改变UI控件相关,当采用多线程工作时,可用以下代码获取 UI线程进行操作: App.Current.Dispatcher.Invoke((Action)delegate() ...
- 尝试获取TextBox_TextChanged事件订阅列表过程
项目中有用到动态事件绑定[多种事件],由于可触发多次绑定,所以想获取订阅列表来判断是否已绑定事件,从而避免问题! 查找相关资料得知Delegate的GetInvocationList方法可以获取委托的 ...
- IOS网络多线程-GCD
Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法. dispatch queue分成以下三种: 1)运行在主线程的Main queue,通过dispat ...