Веб-приложение Cors. NET CORE 3.1 против 2.1 - PullRequest
1 голос
/ 09 января 2020

Недавно я медленно переключался на. NET CORE 3.1 для всего, что я делаю, но когда я пытался портировать часть своего веб-приложения (Restful API), у меня возникли проблемы с Cors.

Код из запущенного проекта. NET CORE 2.1:

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddCors(options =>
            {
                options.AddPolicy("AllowAnyOrigin",
                builder => builder
                    .AllowAnyOrigin()
                    .AllowAnyMethod()
                    .AllowAnyHeader());
            });

            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseHsts();
            }

            app.UseCors("AllowAnyOrigin");

            app.UseHttpsRedirection();

            app.UseMvc();
        }

Код из запущенного проекта. NET CORE 3.1:

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();

            services.AddCors(options =>
            {
                options.AddPolicy("AllowAnyOrigin",
                builder => builder
                    .AllowAnyOrigin()
                    .AllowAnyMethod()
                    .AllowAnyHeader());
            });

            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_3_0);
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseHsts();
            }

            app.UseCors("AllowAnyOrigin");

            app.UseHttpsRedirection();

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }

Когда я делаю запрос к запущенному API 2.1 все идет как положено, но если я пытаюсь сделать тот же запрос к API, работающему 3.1, я получаю ошибку 405 (Ошибка метода не разрешена).

Кто-нибудь еще сталкивался с этой проблемой, если так, то что решение для этого?

1 Ответ

3 голосов
/ 09 января 2020

В вашем методе настройки переместите:

app.UseCors("AllowAnyOrigin");

между

app.UseRouting();

и

app.UseEndpoints(endpoints =>
{
     endpoints.MapControllers();
});

В документации есть предупреждение о том, что промежуточное программное обеспечение cors должно быть настроено между этими двумя методами, иначе промежуточное программное обеспечение перестанет функционировать.

https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-3.1

См. раздел «Применение политик CORS ко всем конечным точкам»

Конфигурирование компонентов в конвейере - это потрясающе, поскольку дает вам контроль, но огромную боль из-за ограничений порядка, я лично жду, когда кто-нибудь создаст надстройку VS, которая проанализирует их и выдаст предупреждения. Был бы отличный проект, если бы кто-то был так склонен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...