ASP. NET Основная веб-страница игнорирует политику CORS в Startup.cs - PullRequest
0 голосов
/ 28 марта 2020

Это не дубликат предыдущих вопросов, потому что их решения говорят о добавлении политики CORS. Мой вопрос здесь заключается в том, почему политика CORS в этом случае игнорируется, несмотря на ее присутствие.


Я получаю основную c ASP. NET веб-страницу Core 2.1, который будет связываться с docker контейнером, работающим на localhost:5082. (Да, NET Core 2.1 немного староват, но для нас на данный момент это неизбежное зло по причинам ведомственного типа.)

Естественно, при попытке запустить проект веб-страницы через В отладчике Visual Studio запрос AJAX на странице не выполняется при попытке доступа к этому контейнеру из-за политики CORS. Итак ... Я зашел на Startup.cs и добавил очень либеральную политику CORS, и по какой-то причине ее игнорируют.

Я пробовал несколько похожих постов и ТАК ответы, которые все делать очень похожие вещи, но это пример того, как мой Startup.cs может выглядеть так:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;

namespace TheNamespace
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<CookiePolicyOptions>(options =>
            {
                // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                options.CheckConsentNeeded = context => true;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });

            services.AddCors(options =>
            {
                options.AddPolicy("AllowAll",
                    builder =>
                    {
                        builder
                        .AllowAnyOrigin()
                        .AllowAnyMethod()
                        .AllowAnyHeader()
                        .AllowCredentials();
                    });
            });
            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.UseExceptionHandler("/Error");
            }

            app.UseStaticFiles();
            app.UseCookiePolicy();

            app.UseCors("AllowAll");
            app.UseMvc();
        }
    }
}

Обратите внимание на вызовы services.AddCors и app.UseCors. Различные посты и SO-ответы имеют немного разные выражения этого, но все они указывают на наличие Startup.cs, очень похожего на это.

Но это как-то игнорируется, и мои самые основные c JavaScript GET вызов http://localhost:5082/... все еще не удается с этим сообщением об ошибке:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:5082/... (Reason: CORS header ‘Access-Control-Allow-Origin’ missing).

Что не так?


Это JavaScript, который не удается (url - это строковое значение):

var xmlHttp = new XMLHttpRequest();
xmlHttp.open('GET', url, false);
//xmlHttp.setRequestHeader("Access-Control-Allow-Origin", "*");
xmlHttp.send(null);
return xmlHttp.responseText;

РЕДАКТИРОВАТЬ:

Это не проект MVC или что-либо необычное. При создании проекта я просто выбрал опцию для Web Application. Так что сейчас у него нет контроллеров, только страницы.


РЕДАКТИРОВАТЬ:

Согласно комментариям, это в основном структура моего проекта:

Pages:
    Shared:
        _CookieConsentPartial.cshtml
        _Layout.cshtml
        _ValidationScriptsPartial.cshtml
    _ViewImports.cshtml
    _ViewStart.cshtml
    Index.cshtml
Program.cs
Startup.cs

С точки зрения URL, это http://localhost:5082/api/buildcactus.

1 Ответ

0 голосов
/ 28 марта 2020

Это сработало для меня. CorsPolicyBuilder в компоновщике настраивает политику. Теперь вы можете использовать его в контроллерах:

[EnableCors("AllowAll")]
public class MyController
{

}

app.UseCors("AllowAll") само по себе может не работать для конечных точек API. Попробуйте явно добавить [EnableCors("AllowAll")] на контроллер.

...