如何获得ASP.NET Core中已注册中间件的列表?

Jez*_*Jez 11 c# middleware asp.net-core

在ASP.NET Core中,可以Configure使用用于Web主机构建器的启动类的方法,在过程中注册新的中间件到请求处理管道中app.UseMiddleware(...)。但是,在调试期间,如何获得已注册的中间件提供程序的列表?我看不到任何实际查看已为该应用程序注册的中间件的方法。

Jez*_*Jez 6

有人指出的另一个问题与此非常相似:

出于某种原因,中间件列表无法公开获得。但是,在调试模式下,可以通过IApplicationBuilder appConfigure方法执行期间检查变量(特别_components是非公共成员)来使用它。该非公开成员是IList<Func<RequestDelegate, RequestDelegate>>,其中包含代表到目前为止已注册的中间件的条目列表。


Shi*_*lah 6

虽然问题是在调试期间获取中间件列表,但以防万一有人需要,可以使用以下基于反射的代码以编程方式获取请求管道中注册的中间件列表:

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");
    }
    );
}
Run Code Online (Sandbox Code Playgroud)