Сетевое ядро ​​asp Middleware, которое нуждается в отличной версии - PullRequest
1 голос
/ 19 сентября 2019

У меня есть приложение MVC net core 2.2 с API-версиями.Я только хочу, чтобы промежуточное программное обеспечение работало для версии v2 API или выше.

Класс промежуточного программного обеспечения, который я написал, использует IApiVersionReader.Read(), однако, кажется, что он не заполняется, пока после строки UseMVC вStartup.

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

Ответы [ 2 ]

2 голосов
/ 19 сентября 2019

Получил ответ на странице Github.

Управление версиями API автоматически регистрирует промежуточное программное обеспечение исключительно для простоты.Чтобы самостоятельно контролировать поведение, выполните следующие действия:

Сначала откажитесь от автоматической регистрации:

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

Затем зарегистрируйте промежуточное программное обеспечение, как вам нравится в конвейере:

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

Надеюсь, это поможет.

0 голосов
/ 19 сентября 2019

Я могу вспомнить пару вариантов здесь

  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/

...