2

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

我编写的中间件类使用IApiVersionReader.Read(), 但是似乎直到UseMVCStartup.

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));
    }
4

2 回答 2

4

在 Github 页面上得到了回复。

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

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

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

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

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

我希望这会有所帮助。

于 2019-09-19T15:54:28.660 回答
0

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

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

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

于 2019-09-19T14:40:20.230 回答