. NET запросы основных опций возвращают 405 ошибок - PullRequest
0 голосов
/ 16 января 2020

Мне нужно добавить поддержку CORS в. NET core 3.1 API (было 2.2, но я решил обновить в то же время). Я думал, что это будет легко. Документация здесь: https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-3.1 выглядит довольно просто. Я хочу поддерживать одну и ту же политику CORS на всех конечных точках. Итак, я решил оставить свои контроллеры в покое и просто внести изменения в startup.cs. Чего мне не хватает?

У меня есть конечная точка POST, но запросы OPTIONS возвращают ошибку 405. Я думал, что промежуточное программное обеспечение CORS должно было обрабатывать запрос, так что мне вообще не нужно думать о CORS внутри контроллеров.

Startup.cs

  namespace MyAPI
  {
    public class Startup
    {

        readonly String ALLOW_ALL = "AllowAll";
        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<IISOptions>(options =>
            // {
            //     options.AutomaticAuthentication = true;
            // });
            services.AddLogging();
            services.AddCors(options =>
            {
                options.AddDefaultPolicy(builder =>
                {
                    builder
                    .AllowAnyOrigin()
                    .AllowAnyMethod()
                    .AllowAnyHeader();
                    // .AllowCredentials();
                });
            });
            services.AddMvc(MvcOptions => MvcOptions.EnableEndpointRouting = false);

        }

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

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

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

            app.UseMvc();
        }
    }
}

MyController.cs

namespace MyProj.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class FacilitiesController : ControllerBase
    {

        public FacilitiesController()
        {
        }


        [HttpPost]
        public JsonResult FloorPlanURL([FromBody] UniqueFloor theFloor)
        {
          <stuff happens>
          return new JsonResult(new {success = true, url = out});
        }

Я прошел несколько итераций, и здесь тоже смотрю: https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-3.1#enable -cors-with-endpoint-routing . Я, наверное, скучаю по чему-то маленькому и простому. Я мог бы добавить ручные обработчики OPTIONS во все контроллеры, но это выглядит довольно паршивым решением.

1 Ответ

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

вам нужно изменить свой класс StartUp.cs, попробуйте поместить код следующим образом ...

public void ConfigureServices (IServiceCollection services) {
    services.AddLogging ();
    services.AddCors (); // just adding the cors to the services
    services.AddMvc ().SetCompatibilityVersion (CompatibilityVersion.Version_2_2);
}
public void Configure (IApplicationBuilder app, IHostingEnvironment env) {
    // global cors policy
    app.UseCors (x => x
        .AllowAnyOrigin ()
        .AllowAnyMethod ()
        .AllowAnyHeader ()); // configure CORS

    app.UseHttpsRedirection ();
    app.UseMvc ();
}

И CORS должен работать правильно для всех ваших Apicontrollers.

Если код ошибки 405 продолжает появляться: означает, что вы не правильно звоните конечной точке.

Пожалуйста, проверьте и дайте мне отзыв о результате.

...