【问题标题】:asp net core Middleware that needs apiversioning version需要apiversioning版本的asp net core中间件
【发布时间】:2020-01-20 14:10:23
【问题描述】:

我有一个带有 API 版本控制的 MVC net core 2.2 应用程序。我只希望中间件为 api 的 v2 或更高版本运行。

我编写的中间件类使用了IApiVersionReader.Read(),但它似乎直到Startup 中的UseMVC 行之后才被填充。

var apiVersion = _apiVersionReader.Read(_httpContextAccessor.HttpContext.Request);

所以如果我在UseMVC之前注册了我的中间件,那么它就无法使用版本控制的方法读取版本。

但如果我将中间件放在UseMVC 行之后,则它根本不会触发。

感觉就像是先有鸡还是先有蛋!我怎样才能让它工作?

为简洁起见,这是我的创业公司的简化版本。

public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc(config =>
            {
                // Don't add auth in development.        
                if (!CurrentEnvironment.IsDevelopment())
                {
                    var policy = new AuthorizationPolicyBuilder()
                        .RequireAuthenticatedUser()
                        .Build();
                    config.Filters.Add(new AuthorizeFilter(policy));
                }
            }
        );

        services.AddTransient<IHttpContextAccessor, HttpContextAccessor>();

        services.AddMvcCore()
            .AddAuthorization()
            .AddJsonFormatters(config =>
                config.ReferenceLoopHandling = ReferenceLoopHandling.Ignore);

        services.AddApiVersioning(options =>
        {
            options.ReportApiVersions = true;
            options.AssumeDefaultVersionWhenUnspecified = true;
            options.DefaultApiVersion = new ApiVersion(2, 0);
        });

    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {

        app.UseMvc();

        app.UseMiddleware(typeof(UserDataLoggingMiddleware));
    }

【问题讨论】:

    标签: c# asp.net-core asp.net-core-mvc middleware api-versioning


    【解决方案1】:

    我可以在这里想到几个选项

    1. 您可以通过_httpContextAccessor.HttpContext.Request.Path 手动获取URL 中的版本,或者如果它在标头中,则使用_httpContextAccessor.HttpContext.Request.Headers

    2. 注册中间件时使用UseWhen。这将配置中间件管道。你想要的是一个重新加入的分支。有关分支中间件的更多信息,请参阅这篇精彩的文章 -> https://thomaslevesque.com/2018/03/27/understanding-the-asp-net-core-middleware-pipeline/

    【讨论】:

      【解决方案2】:

      在 Github 页面上得到了响应。

      API 版本控制自动注册它的中间件纯粹是为了简单。要自己控制行为,请执行以下操作:

      首先,选择退出自动注册:

      services.AddApiVersioning(options => options.RegisterMiddleware = false);
      

      然后,在管道中注册你喜欢的中间件:

      services.UseApiVersioning();
      services.UseMvc();
      

      希望对你有帮助。

      【讨论】:

      • 这是正确的设置;但是,值得注意的是,中间件唯一要做的就是将 IApiVersioningFeature 注册到当前的 HttpContext 中。请注意,关于当前请求的 API 版本的最终决定尚未解决。在中间件中没有一种简单的方法可以做到这一点。 IApiVersioningFeature 将通过 IApiVersionReader 为您获取原始和解析的 API 版本,但要知道解析 API 版本可能是 null(例如:它是无效的)或可能不是实际存在。您需要在中间件实现中考虑到这一点
      猜你喜欢
      • 2015-03-20
      • 2020-07-11
      • 2018-02-19
      • 2017-05-18
      • 1970-01-01
      • 1970-01-01
      • 2019-10-21
      • 2019-06-26
      • 1970-01-01
      相关资源
      最近更新 更多