Skip to content

Commit cc17c2c

Browse files
committed
确保filter的OnResponseAsync在HandleResponseAsync之后
1 parent e2d2790 commit cc17c2c

File tree

1 file changed

+39
-5
lines changed

1 file changed

+39
-5
lines changed

WebApiClientCore/Implementations/ApiRequestExecutor.cs

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,24 +28,58 @@ public static RequestDelegate Build(ApiRequestContext request)
2828
builder.Use(next => async request =>
2929
{
3030
await HandleRequestAsync(request).ConfigureAwait(false);
31+
return await next(request).ConfigureAwait(false);
32+
});
33+
34+
// GlobalFilter.OnRequestAsync
35+
foreach (var filter in request.HttpContext.HttpApiOptions.GlobalFilters)
36+
{
37+
builder.Use(next => async request =>
38+
{
39+
await filter.OnRequestAsync(request).ConfigureAwait(false); // 应该把 next 做为 OnRequestAsync 的参数,在OnRequestAsync里调用才正确
40+
return await next(request).ConfigureAwait(false);
41+
});
42+
}
43+
44+
// FilterAttribute.OnRequestAsync
45+
foreach (var filter in request.ActionDescriptor.FilterAttributes)
46+
{
47+
builder.Use(next => async request =>
48+
{
49+
await filter.OnRequestAsync(request).ConfigureAwait(false); // 应该把 next 做为 OnRequestAsync 的参数,在OnRequestAsync里调用才正确
50+
return await next(request).ConfigureAwait(false);
51+
});
52+
}
53+
54+
builder.Use(next => async request =>
55+
{
3156
var response = await next(request).ConfigureAwait(false);
3257
await HandleResponseAsync(response).ConfigureAwait(false);
3358

3459
// TODO 在这里释放 requestAbortedLinker 才正确
35-
3660
return response;
3761
});
3862

39-
// GlobalFilter
63+
// GlobalFilter.OnResponseAsync
4064
foreach (var filter in request.HttpContext.HttpApiOptions.GlobalFilters)
4165
{
42-
builder.Use(filter.ExecuteAsync);
66+
builder.Use(next => async request =>
67+
{
68+
var response = await next(request).ConfigureAwait(false);
69+
await filter.OnResponseAsync(response).ConfigureAwait(false);
70+
return response;
71+
});
4372
}
4473

45-
// FilterAttribute
74+
// FilterAttribute.OnResponseAsync
4675
foreach (var filter in request.ActionDescriptor.FilterAttributes)
4776
{
48-
builder.Use(filter.ExecuteAsync);
77+
builder.Use(next => async request =>
78+
{
79+
var response = await next(request).ConfigureAwait(false);
80+
await filter.OnResponseAsync(response).ConfigureAwait(false);
81+
return response;
82+
});
4983
}
5084

5185
return builder.Build();

0 commit comments

Comments
 (0)