Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 调用时访问中间件选项_C#_Asp.net Core - Fatal编程技术网

C# 调用时访问中间件选项

C# 调用时访问中间件选项,c#,asp.net-core,C#,Asp.net Core,我正在创建一个自定义中间件元素,但不知道如何将Options对象传递给中间件并在Invoke方法中访问它们 配置: 分机: 结果发现我使用了错误的方法来添加中间件 更改为将中间件添加到ApplicationBuilder中,并使用UseMediddleware,它无法按照我的要求获取选项 分机: MiddleConfig: 我不明白你有什么问题。您正在通过构造函数传递选项,并将其存储在实例变量中,这样您就可以在Invoke方法中访问该变量。@Stijn这样做是吗?难道不可能以某种方式获得构造函数

我正在创建一个自定义中间件元素,但不知道如何将Options对象传递给中间件并在Invoke方法中访问它们

配置:

分机:


结果发现我使用了错误的方法来添加中间件

更改为将中间件添加到ApplicationBuilder中,并使用UseMediddleware,它无法按照我的要求获取选项

分机:

MiddleConfig:


我不明白你有什么问题。您正在通过构造函数传递选项,并将其存储在实例变量中,这样您就可以在Invoke方法中访问该变量。@Stijn这样做是吗?难道不可能以某种方式获得构造函数中的值吗?我的小中间件的构造函数接受两个参数,RequestDelegate和MiddleConfig。我不能从中间启动一个对象,因为我不能提供requestdelegates。你想自己构造一个中间实例吗?不管怎样,我想我现在理解了您的问题:您没有在DI容器中注册opt,所以在中间件中_opt为null或崩溃,对吗?看一看,可能也会对你有用。
public class MiddleConfig
{
    private readonly ICollection<string> _c;

    public MiddleConfig()
    {
        _c = new Collection<string>();
    }

    public void AddPath(string path)
    {
        _c.Add(path);
    }

    public IEnumerable<string> Paths => _c;
}
public class Middle
{
    private readonly RequestDelegate _next;
    private readonly MiddleConfig _opt = new MiddleConfig();

    public Middle(RequestDelegate next, MiddleConfig options)
    {
        _opt = options;
        _next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        await _next.Invoke(context);
    }
}
public static IServiceCollection AddLCPathControl(this IServiceCollection services, Action<MiddleConfig> options)
{
    MiddleConfig opt = new MiddleConfig();
    options.Invoke(opt);

    return services.AddScoped<Middle>();
}
public static class IServiceCollectionExtension
{
    public static IApplicationBuilder UseLCPathControl(this IApplicationBuilder services, string path)
    {
        return services.UseLCPathControl(o => o.AddPath(path));
    }

    public static IApplicationBuilder UseLCPathControl(this IApplicationBuilder builder, Action<MiddleConfig> options)
    {
        MiddleConfig opt = new MiddleConfig();
        options.Invoke(opt);

        return builder.UseMiddleware<Middle>(opt);
    }
}
public class Middle
{
    private readonly RequestDelegate _next;
    private readonly MiddleConfig _opt = new MiddleConfig();

    public Middle(RequestDelegate next, MiddleConfig options)
    {
        _opt = options;
        _next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        await _next.Invoke(context);
    }
}
public class MiddleConfig
{
    private readonly ICollection<string> _c;

    public MiddleConfig()
    {
        _c = new Collection<string>();
    }

    public void AddPath(string path)
    {
        _c.Add(path);
    }

    public IEnumerable<string> Paths => _c;
}