Не удается включить cors при запуске из-за ошибки предполетной проверки

Я безуспешно пытаюсь включить CORS в Startup.cs. У меня есть приложение Angular на порту 4200, которое пытается связаться с моим веб-приложением на C#. Я продолжаю получать эту ошибку в Angular

Failed to load http://localhost:52008/Account/GetJWT: Response for preflight does not have HTTP ok status.

Мои исследования, похоже, указывают на то, что CORS не включается должным образом. Есть идеи, что мне не хватает?

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

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
.......
 app.UseCors("EnableCORS");
 ........
 }

И вот запрос Angular POST:

  login(form: NgForm) {
    let credentials = JSON.stringify(form.value);
    console.log(credentials);
    this.http.post("http://localhost:52008/Account/GetJWT", credentials, {
      headers: new HttpHeaders({
        "Content-Type": "application/json"
      })
    })
  }

Результат запроса POSTMAN

enter image description here

похоже, что AllowCredentials вызывает проблему с глаголом OPTIONS, см. этот QA. похоже, лучше иметь [EnableCors("EnableCORS")] в контроллере, чем глобальную регистрацию для каждого запроса. и будет лучше, если вы сможете использовать почтальон для просмотра заголовков ..

Bagus Tesa 14.09.2018 01:47

или app.UseCors("EnableCORS"); был назван после app.UseMvc() ..

Bagus Tesa 14.09.2018 01:55

Пожалуйста, взгляните на Прокси-сервер Fiddler, ознакомьтесь с ним и часто используйте его - он точно расскажет вам, что происходит с все, ваши запросы и ответы, а как разработчик API / полного стека вы сэкономите часы за часами, решая проблемы нравится. Узнайте, каков HTTP-статус запроса предварительной проверки, и вы сможете лучше понять, как его исправить.

pcdev 14.09.2018 03:06

Аутентификация Windows? Вместо этого используйте модуль IIS CORS, docs.microsoft.com/en-us/iis/extensions/cors-module/…

Lex Li 14.09.2018 03:34

@BagusTesa. Вы имеете в виду изображение над заголовками в Postman? И я проверил - app.UseCors("EnableCORS"); был вызван до app.UseMvc ()

Rilcon42 14.09.2018 05:15

@ Rilcon42 Добавлен ли [EnableCors("EnableCORS")] в класс контроллера или метод действия? Применение на уровне класса контроллера включит cors для всех методов действий

Mohsin Mehmood 16.09.2018 22:30
1
6
511
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

            services.AddMvc(); // 

// --------------------------------------

// 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();
        }
        app.UseCors("Cors");//------>let app use new service
        app.UseMvc();

    }

Внутри вашего контроллера убедитесь, что вы берете объект с тела

// запрос на публикацию

 [HttpPost]
    public Message Post([FromBody] Message message)
    {

    var msg = new Message { Owner = message.Owner, Text = message.Text };
    db.Messages.AddAsync(msg);
    db.SaveChangesAsync();

    return message;

}

Вы можете настроить ядра в startup.cs, как показано ниже, и добавить источник в ConfigurationServices, как показано ниже.

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(options =>
    {
        options.AddPolicy("AllowSpecificOrigin",
            builder => builder.WithOrigins("http://example.com"));
    });
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env, 
    ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole();

    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    // Shows UseCors with named policy.
    app.UseCors("AllowSpecificOrigin");

    app.Run(async (context) =>
    {
        await context.Response.WriteAsync("Hello World!");
    });
}

Добавьте политику CORS к определенному действию.

[HttpGet]
[EnableCors("AllowSpecificOrigin")]
public IEnumerable<string> Get()
{
    return new string[] { "value1", "value2" };
}

Ссылка: Включение запросов между источниками (CORS) в ASP.NET Core

Ответ принят как подходящий

Используйте следующий код, чтобы включить CORS. Версия .NET Core: 2.1 и угловая версия: 1.6.7

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.AddMvc()
            .AddJsonOptions(options =>
        {
            options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
            options.SerializerSettings.PreserveReferencesHandling = PreserveReferencesHandling.None;                
        });

        services.AddCors();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider serviceProvider)
    { 
        app.UseCors(options =>
        {
            options.AllowAnyMethod();
            options.AllowAnyOrigin();
            options.AllowAnyHeader();
        });

        app.UseMvc();
    }   
}

Угловой код:

$http.post("http://localhost:52008/Account/GetJWT", credentials,{
    headers: new HttpHeaders({
        "Content-Type": "application/json"
})).then(
function(response) {
    console.log(response);
},
function() {
    console.log("unable to login");
});

Сообщите мне, если проблема не исчезнет.

измените свой web.config:

<system.webServer>

    ...

<httpProtocol>
    <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept, Cache-Control" />
        <add name="Access-Control-Allow-Credentials" value="true" />
        <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
    </customHeaders>
</httpProtocol>
</system.webServer>

Другие вопросы по теме