Проблема с Cors для проекта Angular /. NET Core - PullRequest
0 голосов
/ 04 августа 2020

Я не могу получить данные из своего HTTP-запроса. На стороне сервера у меня есть следующие

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();
    services.AddSwaggerGen();
    services.AddScoped<IRepository, Repository>();
    services.AddAuthentication(IISDefaults.AuthenticationScheme);
    services.AddCors(options => 
            options.AddDefaultPolicy(builder => builder
               .WithOrigins("http://localhost:4200")
               .AllowAnyMethod().AllowAnyHeader().AllowCredentials()));
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
        
    app.UseSwagger();
    app.UseSwaggerUI(c =>
    {
        c.SwaggerEndpoint("/swagger/v1/swagger.json", "KYCDB API");
    });

    app.UseHttpsRedirection();

    app.UseRouting();

    app.UseCors();

    app.UseAuthentication();

    app.UseAuthorization();

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

В проекте также есть windows аутентификация включена, анонимная отключена.

"iisSettings": {
    "windowsAuthentication": true,
    "anonymousAuthentication": false,
    "iisExpress": {
       "applicationUrl": "http://localhost:51721",
       "sslPort": 49321
    }
}

А на стороне angular я получил компонент

export class HeaderComponent implements OnInit {
  currentEmployee$: Observable<Employee>;

  constructor(private userService: UserService) { }

  ngOnInit(): void {
    this.currentEmployee$ = this.userService.getCurrentEmployee();
  }
}

и перехватчик

@Injectable()
export class ApiInterceptor implements HttpInterceptor {

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    req = req.clone({ withCredentials: true });
    return next.handle(req);
  }
}

Когда страница загружается, я получаю 2 предупреждения и сообщение об ошибке

Предупреждение: запрос перекрестного происхождения заблокирован: одна и та же политика происхождения запрещает чтение удаленного ресурса по адресу http://localhost: 51721 / сотрудник / текущий. (Причина: заголовок CORS 'Access-Control-Allow-Origin' отсутствует).

Предупреждение: запрос перекрестного происхождения заблокирован: та же политика происхождения запрещает чтение удаленного ресурса по адресу http://localhost: 51721 / employee / current . (Причина: запрос CORS не выполнен).

Ошибка: ответ об ошибке HTTP для http://localhost: 51721 / сотрудник / текущий: 0 Неизвестная ошибка

Что мне нужно исправить?

1 Ответ

1 голос
/ 05 августа 2020

Извините, это сложный вопрос, поэтому может быть ряд причин, по которым он не работает, но я столкнулся с аналогичной проблемой и решил ее, изменив вызов cors в функции Configure (). Функция Configure () вызывается во время выполнения и действует как конвейер HTTP-запросов, поэтому в некоторых случаях порядок выполнения имеет значение (https://docs.microsoft.com/en-us/aspnet/core/fundamentals/startup?view=aspnetcore-3.1#the -configure-method )

Вы можете попробовать следующее:

Изменить текущий:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
        
    app.UseSwagger();
    app.UseSwaggerUI(c =>
    {
        c.SwaggerEndpoint("/swagger/v1/swagger.json", "KYCDB API");
    });

    app.UseHttpsRedirection();

    app.UseRouting();

    app.UseCors(); // Move this

    app.UseAuthentication();

    app.UseAuthorization();

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

To:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
        
    app.UseSwagger();
    app.UseSwaggerUI(c =>
    {
        c.SwaggerEndpoint("/swagger/v1/swagger.json", "KYCDB API");
    });

    app.UseRouting();

    app.UseCors(); // Here

    app.UseHttpsRedirection();

    app.UseAuthentication();

    app.UseAuthorization();

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

Следовательно, первой операцией в конвейере http будет проверка cors. Я считаю, что это честная ставка, так как из вашего вопроса похоже, что вы не получаете ошибку инициализации приложения, а скорее ошибку времени запроса клиента во время выполнения. Не знаю наверняка, решит ли это проблему, но, может быть, это поможет!

...