在 ASP.NET Core 中,您可以在用于 Web 主机构建器的启动类的
Configure
方法期间使用 app.UseMiddleware(...)
将新中间件注册到请求处理管道中。在调试过程中,如何获取已注册的中间件提供程序的列表?我看不到任何方法来实际查看已为应用程序注册的中间件。
来自某人指出的另一个问题与此非常相似:
由于某种原因,中间件列表未公开。不过,在调试模式下,可以通过在执行
IApplicationBuilder app
方法期间检查 Configure
变量(特别是 _components
非公共成员)来使用它。该非公开成员是一个 IList<Func<RequestDelegate, RequestDelegate>>
,包含代表迄今为止已注册的中间件的条目列表。
虽然问题是在调试期间获取中间件列表,但以防万一有人需要,可以使用以下基于反射的代码以编程方式获取请求管道中已注册中间件的列表:
private void CollectListOfMiddleware(IApplicationBuilder app)
{
_listOfMiddleware = new StringBuilder();
FieldInfo _componentsField = app.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance).Single(pi => pi.Name == "_components");
List<Func<RequestDelegate, RequestDelegate>> _componentsValue =
_componentsField.GetValue(app) as List<Func<RequestDelegate, RequestDelegate>>;
_componentsValue.ForEach(x =>
{
FieldInfo middlewareField = x.Target.GetType().GetRuntimeFields().Single(pi => pi.Name == "middleware");
object middlewareValue = middlewareField.GetValue(x.Target);
_listOfMiddleware.Append($"{middlewareValue.ToString()}\n");
}
);
}
public static List<object> GetMiddleware(this IApplicationBuilder app)
{
var list = new List<object>();
var field = app.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance).Single(pi => pi.Name == "_components");
var components = field.GetValue(app) as List<Func<RequestDelegate, RequestDelegate>>;
components.ForEach(c =>
{
var middlewareField = c.Target.GetType().GetRuntimeFields().SingleOrDefault(pi => pi.Name == "_middleware");
if (middlewareField != null)
{
var middlewareValue = middlewareField.GetValue(c.Target);
list.Add(middlewareValue);
}
});
return list;
}