导航

01-004 HttpAbstractions 之 UseExtension 与 RunExtension

Posted on 2015-03-05 14:15  DotNet1010  阅读(187)  评论(0)    收藏  举报

UseExtension 关键代码

        public static IApplicationBuilder Use(this IApplicationBuilder app, Func<HttpContext, Func<Task>, Task> middleware)
        {
            return app.Use(next =>
            {
                return context =>
                {
                    Func<Task> simpleNext = () => next(context);
                    return middleware(context, simpleNext);
                };
            });
        }

假定只使用了一次 Use 方法 :则上文中的 next 指的便是:

前文中的如下代码:

            RequestDelegate app = context =>
            {
                context.Response.StatusCode = 404;
                return Task.FromResult(0);
            };

 其中的context 指的是特定请求的 HttpContext.

 simpletext 执行的结果是返回 404.

 middleware 是一个中间件 里面的大致逻辑是 可以处理HttpContext 则处理 处理完可以直接返回 或者继续处理(即:返回404)

如访问一个文件 如果文件存在 则返回文件内容 如果文件不存在 则调用 simpleNext(HttpContext) 即:返回404。

------------------------------------------------------------------------------------------------------------------------

 RunExtension 关键代码

      public static void Run([NotNull] this IApplicationBuilder app, [NotNull] RequestDelegate handler)
        {
            app.Use(_ => handler); 
// Use(Func<RequestDelegate, RequestDelegate> middleware);
// 为了方便理解 可以写成 app.Use(nextInvokeHttpContextFunction=>currentInvokeHttpContextFunction);
// 也可以这样写 app.Use((ctx ,ft)=> handler(ctx)); 用的是 Use(this IApplicationBuilder app, Func<HttpContext, Func<Task>, Task> middleware) }

 Run方法和Use方法的区别是什么呢?

Run方法传入的参数是 handler 返回Task的一个函数 

Use 方法传入的参数是middleware 同样也返回Task 但是输入参数有一个是Func<Task> 这个方法更加的抽象

结论 Run方法更容易理解 用户直接调用Run方法,由Run方法去调用抽象的Use方法,Use方法直接调用

            IApplicationBuilder 中的  Use(Func<RequestDelegate, RequestDelegate> middleware);