在阅读了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的更多相关文章

  1. 200行代码,7个对象——让你了解ASP.NET Core框架的本质

    2019年1月19日,微软技术(苏州)俱乐部成立,我受邀在成立大会上作了一个名为<ASP.NET Core框架揭秘>的分享.在此次分享中,我按照ASP.NET Core自身的运行原理和设计 ...

  2. 了解ASP.NET Core框架的本质

    了解ASP.NET Core框架的本质 ASP.NET Core自身的运行原理和设计思想创建了一个 “迷你版” 的ASP.NET Core框架,并且利用这个 “极简” 的模拟框架阐述了ASP.NET ...

  3. 200行代码,7个对象——让你了解ASP.NET Core框架的本质

    原文:200行代码,7个对象--让你了解ASP.NET Core框架的本质 2019年1月19日,微软技术(苏州)俱乐部成立,我受邀在成立大会上作了一个名为<ASP.NET Core框架揭秘&g ...

  4. ASP.NET Core框架的本质

    源文章地址:http://www.cnblogs.com/artech/p/inside-asp-net-core-framework.html 1.从Hello World谈起 当我们最开始学习一门 ...

  5. ASP.NET Core框架深度学习(一) Hello World

    对于学习Core的框架,对我帮助最大的一篇文章是Artech的<200行代码,7个对象——让你了解ASP.NET Core框架的本质>,最近我又重新阅读了一遍该文.本系列文章就是结合我的阅 ...

  6. WPF中的常用布局 栈的实现 一个关于素数的神奇性质 C# defualt关键字默认值用法 接口通俗理解 C# Json序列化和反序列化 ASP.NET CORE系列【五】webapi整理以及RESTful风格化

    WPF中的常用布局   一 写在开头1.1 写在开头微软是一家伟大的公司.评价一门技术的好坏得看具体的需求,没有哪门技术是面面俱到地好,应该抛弃对微软和微软的技术的偏见. 1.2 本文内容本文主要内容 ...

  7. 一个Mini的ASP.NET Core框架的实现

    一.ASP.NET Core Mini 在2019年1月的微软技术(苏州)俱乐部成立大会上,蒋金楠老师(大内老A)分享了一个名为“ASP.NET Core框架揭秘”的课程,他用不到200行的代码实现了 ...

  8. 用一个应用场景理解ASP.NET Core Identity是什么?

    目录 前言 基于声明的认证(Claims-based Authentication) 应用场景一 在ASP.NET Core 中Identity是如何实现的 类ClaimsPrincipal 考察另外 ...

  9. ASP.NET Core 框架本质学习

    本文作为学习过程中的一个记录. 学习文章地址: https://www.cnblogs.com/artech/p/inside-asp-net-core-framework.html 一. ASP.N ...

随机推荐

  1. HDU 5667 Sequence 矩阵快速幂

    官方题解: 观察递推式我们可以发现,所有的fi​​都是a的幂次,所以我们可以对f​i​​取一个以a为底的log,g​i​​=log​a​​ f​i​​ 那么递推式变g​i​​=b+c∗g​i−1​​+ ...

  2. HDU 3427

    DP: According to the meaning of problems,if we check n to m, assume x and y are both solvable,then w ...

  3. win7 64位 VS2010调试提示“ORA-12154: TNS: 无法解析指定的连接标识符”的解决方法

    这个问题刚刚遇到,花了半小时,记录下 环境: vs2010[32位]  oracle 10g[32位] 操作系统:windows 7  64位 解决步骤: 1.去网上下载“instantclient- ...

  4. [King.yue]VS2012 无法启动IIS Express Web服务器的解决方案

    打开VS2012解决方案资源管理器 -> 点选 Web 项目选择 -> 属性 -> Web -> 选择“使用 Visual Studio 开发服务器” -> 选中“自动分 ...

  5. javaweb之Java基础加强

    1.myeclipse的安装和使用 * eclipse:是一个免费的开发工具 * myeclipse:是一个收费的插件,破解myeclipse, ** 安装目录的要求: 不能有中文和空格 ** 安装完 ...

  6. linux下的rbenv和rails安裝

    今天是周一,我到新公司的第14天,今天继续linux下ruby和rails环境变量的配置. 首先碰到的问题是 主要看ubuntu下安装rbenv,ruby,rails开发环境, http://blog ...

  7. 《Genesis-3D开源游戏引擎--横版格斗游戏制作教程07:UI》

    概述: UI即User Interface(用户界面)的简称.UI设计是指对软件的燃机交互.操作逻辑.界面美观的整体设计.好的UI设计不仅可以让游戏变得更有品位,更吸引玩家,还能充分体现开发者对游戏整 ...

  8. HW3.6

    import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...

  9. DIV遮罩层传值

    今天费了很大的劲儿才搞定!下面贴出代码和总结: 1.首先是前台代码: <%@ Page Title="" Language="C#" MasterPage ...

  10. libmad和libmpg123解码mp3在安卓手机上的比较

    libmad和libmpg123解码mp3在安卓手机上的比较1. libmad 选自 http://sourceforge.net/projects/mad  libmad-0.15.1b.tar.g ...