ASP.NET CORE RequestDelegate

什么是RequestDelegate

IApplicationBUilder接口中包含以下方法,用来配置中间件,对于这个中间件的定义实则是一个处理请求的委托输入输出均为这个类

1
IApplicationBuilder Use(Func<RequestDelegate, RequestDelegate> middleware);

再来看看另外一个扩展方法,这个同样使用了RequestDelegate,但是只传入了RequestDelegate,没有传出这个类,这是作为最后一个中间件的写法,用于实际处理业务需求,如摘要所写(Adds a terminal middleware delegate to the application’s request pipeline.)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
namespace Microsoft.AspNetCore.Builder
{
//
// 摘要:
// Extension methods for adding terminal middleware.
public static class RunExtensions
{
//
// 摘要:
// Adds a terminal middleware delegate to the application's request pipeline.
//
// 参数:
// app:
// The Microsoft.AspNetCore.Builder.IApplicationBuilder instance.
//
// handler:
// A delegate that handles the request.
public static void Run(this IApplicationBuilder app, RequestDelegate handler);
}
}

下面看看这个RequestDelegate实际是什么,下面是其定义,传入了一个请求上下文,返回了一个异步任务,用于响应请求。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
namespace Microsoft.AspNetCore.Http
{
//
// 摘要:
// A function that can process an HTTP request.
//
// 参数:
// context:
// The Microsoft.AspNetCore.Http.HttpContext for the request.
//
// 返回结果:
// A task that represents the completion of request processing.
public delegate Task RequestDelegate(HttpContext context);
}

让我们来实现一个RequestDelegate,下面是一个静态方法,作为一个获取请求方法(Get还是Post)的处理器,这里只是一个处理器,并不是中间件,因为

1
2
3
4
5
6
7
8
public static Task GetRequestMethod(HttpContext httpContext)
{
return Task.Run(() =>
{
Console.WriteLine(httpContext.Request.Method);
});
}

在实际使用中一般简写为

1
2
3
4
app.Run(async context =>
{
await context.Response.WriteAsync("hello world");
});