[理解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, 0, 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, 0, buffer.Length);
                return next(context);
            };
        };
        var task = middleware1(middleware2(cc => Task.Delay(1)))(c);
        task.Wait();
        c.Response.Close();   // 将响应发送給客户端, 释放response的资源
        listener.Stop();    // 使实例停止接收客户端请求
    }

}

运行以后直接在浏览器输入localhost:6688即可, GitHub地址为: https://github.com/HeabKing/DotNetCoreStudy

posted on 2016-06-12 16:22 HeabKing 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/HeabKing/p/5577970.html

[理解ASP.NET Core框架]一个五十行的控制台Web相关推荐

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

    来源 | https://www.cnblogs.com/artech/p/inside-asp-net-core-framework.html 2019年1月19日,微软技术(苏州)俱乐部成立,我受 ...

  2. 一个迷你ASP.NET Core框架的实现(下)

    [框架内幕]| 作者 / Edison Zhou 这是恰童鞋骚年的第196篇原创文章 上一篇我们了解了AspNetCore.Mini这个项目的背景及项目结构和流程,这一篇我们继续解析几个核心对象.本文 ...

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

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

  4. asp服务器_200行代码,7个对象——让你了解ASP.NET Core框架的本质「3.x版」

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

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

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

  6. 蒋金楠:200行代码7个对象《ASP.NET Core框架揭密》苏州.NET俱乐部课程分享

    [课程名称] <ASP.NET Core框架揭密> [老师介绍] 蒋金楠,同程艺龙机票事业部技术专家,微软最有价值专家(MVP,连续12),多本.NET专著作者.博客园Artech,公众号 ...

  7. spring web请求statuscode = 200 无响应值_200行代码,7个对象——让你了解ASP.NET Core框架的本质[3.x版]...

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

  8. 一步步完成“迷你版” 的ASP.NET Core框架

    一 前言 Artech 分享了 200行代码,7个对象--让你了解ASP.NET Core框架的本质 . 用一个极简的模拟框架阐述了ASP.NET Core框架最为核心的部分. 这里一步步来完成这个迷 ...

  9. npm——安装教程、安装vue脚手架(ASP.NET Core微服务(五)——【vue脚手架解析接口】过度章节)

    npm:是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题. 比如常用的有: 1)允许用户从NPM服务器下载别人编写的第三方包到本地使用. 2)允许用户从NPM服务器下载并 ...

  10. 理解ASP.NET Core中的中间件

    中间件是ASP.NET Core的一个重要特点,ASP.NET Core应用程序之所以能够灵活地处理各种各样的请求,完成都是由于中间件,那么它究竟是怎么一回事呢? 一.理解中间件 ASP.NET Co ...

最新文章

  1. 【模型蒸馏】从入门到放弃:深度学习中的模型蒸馏技术
  2. SQL基础---SQL WHERE 子句
  3. 就业技术书文件表格_Word格式:工程预结算工作流程图及工作表单,附20余表格...
  4. E打开https网站时,提示此网站的安全证书有问题(证书无效)
  5. 如何以10倍速加速Apache Xalan的XPath处理器
  6. Linux删除所有文件(作死命令,危险命令)
  7. java filter加时间戳_java filter加时间戳
  8. 怎么把GMS的软件转到HMS?
  9. 万物的解释 —— 微波炉的工作原理
  10. Web安全防御从WAF到应用网关
  11. 根据ip地址制作html,根据ip掩码计算可用ip
  12. 第一章 数学建模与误差分析
  13. 分布式系统有哪些衡量指标?
  14. Windows server DHCP服务器搭建
  15. JS如何删除节点和所有子节点
  16. SuperMap瓦片技术方案
  17. 【论文精读】Robust Alignment for Panoramic Stitching Via an Exact Rank Constraint
  18. 摄像机投影成像 matlab,使用matlab仿真三维物点的透视投影成像.doc
  19. 群发短信平台哪个好?推荐阿里云短信平台
  20. vscode背景图片设置分享

热门文章

  1. 您从事运维有几年了?
  2. 未来互联网最稀缺的能力是什么?
  3. 感恩节,Google 翻译给大家送礼物啦!
  4. 我为什么坚持写博客?
  5. 超线程_超线程加持,十代酷睿 i5-10400F 成主流玩家真香新 U
  6. 线性回归 - LinearRegression - 预测糖尿病 - 量化预测的质量
  7. UGUI更换图片的三种方法
  8. WPF实现竖向排列并换行显示
  9. Labview 中的类
  10. android studio AsyncHttpClient;AsyncHttpResponseHandler;RequestParams; 失效问题