返回顶部
首页 > 资讯 > 精选 >Asp.net 5中的ApplicationBuilder怎么理解
  • 896
分享到

Asp.net 5中的ApplicationBuilder怎么理解

2023-06-26 05:06:59 896人浏览 八月长安
摘要

本文小编为大家详细介绍“asp.net 5中的ApplicationBuilder怎么理解”,内容详细,步骤清晰,细节处理妥当,希望这篇“Asp.net 5中的ApplicationBuilder怎么理解”文章能帮助大家

本文小编为大家详细介绍“asp.net 5中的ApplicationBuilder怎么理解”,内容详细,步骤清晰,细节处理妥当,希望这篇“Asp.net 5中的ApplicationBuilder怎么理解”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

ApplicationBuilder(IApplicationBuilder接口),是OWIN的基础,而且里面都是代理、代理的代理,各种lambda表达式,估计要看这部分代码,很多人得头昏脑涨。

按惯例先贴代码(这是我修改后的,将接口继承去掉了、HttpContext类修改成自己的MyHttpContext类)

public class ApplicationBuilder    {        private readonly IList<Func<RequestDelegate, RequestDelegate>> _components = new List<Func<RequestDelegate, RequestDelegate>>();        public ApplicationBuilder() { }        private ApplicationBuilder(ApplicationBuilder builder)        {        }        public ApplicationBuilder Use(Func<RequestDelegate, RequestDelegate> middleware)        {            _components.Add(middleware);            return this;        }        public ApplicationBuilder New()        {            return new ApplicationBuilder(this);        }        public RequestDelegate Build()        {            RequestDelegate app = context =>            {                context.StatusCode = "404";                System.Console.WriteLine("404");                return Task.FromResult(0);            };            foreach (var component in _components.Reverse())            {                app = component(app);            }            return app;        }    }

RequestDelegate的定义如下:

public delegate Task RequestDelegate(MyHttpContext context);

从ApplicationBuilder的源代码中我们可以关注3个点:_components、Use方法、Build方法。

  • _components是也一个列表(IList)对象,不过里面类型有点特殊&mdash;&mdash;是以代理RequestDelegate为参数、代理RequestDelegate为返回值的一个代理。这里用代理说有点别嘴,可以把代理叫做函数,就是里面的类型是一个函数,这个函数的参数也是函数,返回值也是函数。

  • Use方法,就是在上面的列表对象后面添加一条新记录。

  • Build方法就是将_components数组按照反向顺序,制作成一个链式结构(有点类似链表的感觉)。下面用俩幅图说明下:

Build之前

Asp.net 5中的ApplicationBuilder怎么理解

Build之后

Asp.net 5中的ApplicationBuilder怎么理解

我们还可以从代码中看到Item1的参数给的是“404”,而返回结果是RequestDelegate类型。也就是说这个返回类似于voidRequestDelegate(MyHttpContext context)。如果系统给我们一个context变量,那么这个管道就可以从头到尾的跑下去了。而事实上在Asp.net5中,这个管道就是用于替代传统的IHttpModule的(可能不准确),那现在问题就来了,Item1的参数是这个管道的第一环还是最后一环呢?从图形来看应该是第一环,但是事实上这是一个误解。因为箭头两面一个是参数,一个是执行体(参数是一个方法,会在执行体内调用执行)。在执行体内,可能在开始就执行参数的内容,之后执行具体的内容;也可以是先执行具体内容,之后执行参数,最后在执行一部分具体内容;还可以先执行具体内容,之后参数;还可能无视参数,直接直接自己的内容,那么之前的参数就会被忽略。也就是说无所谓顺序,404可能是管道的第一环,也可能是最后一环,也可能是中间环节,还可能压根就不执行。这个和Item1、Item2等内容具体的写法有关系。(虽然也是链式结构是不是和链表感觉不一样)

是不是感觉太零活了,源码还对ApplicationBuilder做了俩个扩展方法,代码整理如下:

public static class RunExtensions    {        public static ApplicationBuilder Use(this ApplicationBuilder app, Func<MyHttpContext, Func<Task>, Task> middleware)        {            return app.Use(next =>            {                return context =>                {                    Func<Task> simpleNext = () => next(context);                    return middleware(context, simpleNext);                };            });        }        public static void Run(this ApplicationBuilder app, RequestDelegate handler)        {            if (app == null)            {                throw new ArgumentNullException("why?");            }            if (handler == null)            {                throw new ArgumentNullException("How?");            }            app.Use(_ => handler);        }    }

首先说Use方法,改方法是对之前Use方法的一个更改。将传入的参数更改为Func<MyHttpContext, Func<Task>, Task>。这样做有什么好处?之前的Func<RequestDelegate, RequestDelegate>对象并不能给人清楚的明了的感觉,而Func<MyHttpContext, Func<Task>, Task>就非常明确了。传入的参数:MyHttpContext就是Context对象,Func<Task>就是next的执行体。返回值是一个Task(类似于void)。一目了然。

再说Run方法,显而易见,Run方法只执行自己的内容,并没有执行参数体。所以链式结构的在其前的都会被舍弃,不会被执行。

最后把自己的测试例子贴出来,供大家参考

示例1:

static void Main(string[] args)        {            MyHttpContext context = new MyHttpContext() { StatusCode = "A" };            Func<MyHttpContext, Func<Task>, Task> middleware =                (x, y) => { context.StatusCode += "C"; System.Console.WriteLine(context.StatusCode); return y(); };            Func<MyHttpContext, Func<Task>, Task> middleware2 =              (x, y) => { context.StatusCode += "End1"; System.Console.WriteLine(context.StatusCode); return Task.FromResult(0); };            ApplicationBuilder builder = new ApplicationBuilder();            builder.Use(                next =>                {                    return (MyHttpContext o) =>                    {                        o.StatusCode += "B";                        System.Console.WriteLine(context.StatusCode);                        next(o);                        return Task.FromResult(0);                    };                }            );            builder.Use(middleware);            //builder.Use(middleware2);            //builder.Use(middleware);            //builder.Run(o => { o.StatusCode += "End2"; return Task.FromResult(0); });            builder.Build().Invoke(context);            System.Console.ReadLine();        }

执行结果:

Asp.net 5中的ApplicationBuilder怎么理解

示例2:

static void Main(string[] args)        {            MyHttpContext context = new MyHttpContext() { StatusCode = "A" };            Func<MyHttpContext, Func<Task>, Task> middleware =                (x, y) => { context.StatusCode += "C"; System.Console.WriteLine(context.StatusCode); return y(); };            Func<MyHttpContext, Func<Task>, Task> middleware2 =              (x, y) => { context.StatusCode += "End1"; System.Console.WriteLine(context.StatusCode); return Task.FromResult(0); };            ApplicationBuilder builder = new ApplicationBuilder();            builder.Use(                next =>                {                    return (MyHttpContext o) =>                    {                        o.StatusCode += "B";                        System.Console.WriteLine(context.StatusCode);                        next(o);                        return Task.FromResult(0);                    };                }            );            builder.Use(middleware);            builder.Use(middleware2);            //builder.Use(middleware);            //builder.Run(o => { o.StatusCode += "End2"; System.Console.WriteLine(context.StatusCode); return Task.FromResult(0); });            builder.Build().Invoke(context);            System.Console.ReadLine();        }

执行结果:

Asp.net 5中的ApplicationBuilder怎么理解

示例3:

static void Main(string[] args)        {            MyHttpContext context = new MyHttpContext() { StatusCode = "A" };            Func<MyHttpContext, Func<Task>, Task> middleware =                (x, y) => { context.StatusCode += "C"; System.Console.WriteLine(context.StatusCode); return y(); };            Func<MyHttpContext, Func<Task>, Task> middleware2 =              (x, y) => { context.StatusCode += "End1"; System.Console.WriteLine(context.StatusCode); return Task.FromResult(0); };            ApplicationBuilder builder = new ApplicationBuilder();            builder.Use(                next =>                {                    return (MyHttpContext o) =>                    {                        o.StatusCode += "B";                        System.Console.WriteLine(context.StatusCode);                        next(o);                        return Task.FromResult(0);                    };                }            );            builder.Use(middleware);            //builder.Use(middleware2);            //builder.Use(middleware);            builder.Run(o => { o.StatusCode += "End2"; System.Console.WriteLine(context.StatusCode); return Task.FromResult(0); });            builder.Build().Invoke(context);            System.Console.ReadLine();        }

执行结果:

Asp.net 5中的ApplicationBuilder怎么理解

读到这里,这篇“Asp.net 5中的ApplicationBuilder怎么理解”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

--结束END--

本文标题: Asp.net 5中的ApplicationBuilder怎么理解

本文链接: https://lsjlt.com/news/307054.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Asp.net 5中的ApplicationBuilder怎么理解
    本文小编为大家详细介绍“Asp.net 5中的ApplicationBuilder怎么理解”,内容详细,步骤清晰,细节处理妥当,希望这篇“Asp.net 5中的ApplicationBuilder怎么理解”文章能帮助大家...
    99+
    2023-06-26
  • 详解Asp.net5中的ApplicationBuilder
    ApplicationBuilder(IApplicationBuilder接口),是OWIN的基础,而且里面都是代理、代理的代理,各种lambda表达式,估计要看这部分代码,很多人...
    99+
    2024-04-02
  • Ubuntu中怎么搭建ASP.NET 5开发环境
    本篇文章给大家分享的是有关Ubuntu中怎么搭建ASP.NET 5开发环境,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。0&times;01 Windows和Ubunt...
    99+
    2023-06-17
  • ASP.NET Page该怎么理解
    这篇文章将为大家详细讲解有关ASP.NET Page该怎么理解,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Page,我想每个ASP.NET开发人员对它应该都是比较熟悉的。这次的博客我就打算...
    99+
    2023-06-17
  • ASP.NET WebForm重写URL怎么理解
    本篇内容主要讲解“ASP.NET WebForm重写URL怎么理解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ASP.NET WebForm重写URL怎么理解”吧!进行开发ASP.NET We...
    99+
    2023-06-17
  • 如何理解ASP.NET MVC 中的Web Pages
    今天就跟大家聊聊有关如何理解ASP.NET MVC 中的Web Pages,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。I:Web Pages 1.0中以“_”开头的特别文件(文件命...
    99+
    2023-06-17
  • asp.net中MVC的处理流程详解
    asp.net MVC 分为主要的Controller 、Action、以及Views 下面来分析Asp.net MVC的处理流程: Controller 负责将获取Model数据并...
    99+
    2024-04-02
  • 理解ASP.NET Core 中间件(Middleware)
    目录中间件中间件管道RunUseUseWhenMapMapWhenRun & Use & UseWhen & Map & Map编写中间件并激活基于约...
    99+
    2024-04-02
  • ASP.net中Attributes.Add()失效怎么解决
    ASP.NET中使用Attributes.Add()方法添加属性时,如果失效,可以尝试以下解决方法:1. 确保在正确的事件中添加属性...
    99+
    2023-08-08
    ASP.net
  • 如何理解ASP.NET MVC 3 Beta中的Chart
    这篇文章给大家介绍如何理解ASP.NET MVC 3 Beta中的Chart,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。小编将介绍Chart的使用。包括Chart数据源的配置、Chart的显示、Chart保存三个方面...
    99+
    2023-06-17
  • ASP.NET中怎么利用Routing处理请求
    ASP.NET中怎么利用Routing处理请求,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。ASP.NET Routing是一个通用的组件,它不涉及到任何具体的...
    99+
    2023-06-17
  • Asp.net中的DataBinder.Eval怎么使用
    在ASP.NET中,DataBinder.Eval方法用于从绑定的数据源中检索属性的值。它通常与数据绑定控件一起使用,如GridVi...
    99+
    2024-03-02
    Asp.net
  • ASP.NET中怎么处理复合控件事件
    本篇文章给大家分享的是有关ASP.NET中怎么处理复合控件事件,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。(1) 直接实现按钮事件在控件中(以下代码并非实现复合控件)直接实现...
    99+
    2023-06-18
  • ASP.NET Core中的Configuration怎么配置
    这篇文章主要讲解了“ASP.NET Core中的Configuration怎么配置”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ASP.NET Core中的Configu...
    99+
    2023-06-29
  • ASP.NET Core处理管道的深入理解
    前言 在 ASP.NET Core 的管道处理部分,实现思想已经不是传统的面向对象模式,而是切换到了函数式编程模式。这导致代码的逻辑大大简化,但是,对于熟悉面向对象编程,而不是...
    99+
    2022-06-07
    core net ASP.NET 管道 ASP
  • ASP.NET中怎么生成XML
    本篇文章给大家分享的是有关ASP.NET中怎么生成XML,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1.业务逻辑层:public DataSet ABCD...
    99+
    2023-06-17
  • ASP.NET中Server.MapPath怎么使用
    在ASP.NET中,Server.MapPath方法用于将虚拟路径映射到物理文件路径。使用Server.MapPath方法的一般语法...
    99+
    2023-09-26
    ASP.NET
  • ASP.Net中EnableViewState怎么使用
    在ASP.Net中,EnableViewState属性用于指定是否启用ViewState机制来跟踪页面的状态。默认情况下,Enabl...
    99+
    2023-09-26
    ASP.Net
  • asp.net中CodeSmith怎么使用
    CodeSmith是一个代码生成工具,可以帮助开发人员快速生成代码。在ASP.NET中使用CodeSmith可以按照以下步骤进行:1...
    99+
    2023-09-26
    asp.net CodeSmith
  • asp.net中viewState怎么使用
    在ASP.NET中,ViewState是用于在页面回发时存储页面的状态信息的一种机制。要使用ViewState,需要进行以下步骤:1...
    99+
    2023-09-13
    asp.net viewState
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作