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);
浙公网安备 33010602011771号