1
votes

Impossible de comprendre CORS dans l'API Web .net core 3.1

J'ai essayé de déplacer tous mes appels de méthode au moins 10 000 fois. J'ai besoin du numéro de tentative 10 001 pour être le gagnant! Qu'est-ce que je fais mal?

Je reçois toujours l'erreur liée à CORS, mais j'ai suivi les guides pour essayer de la résoudre.

fetch('http://localhost:44387/api/Users/GetTest').then(function (response) {
      this.state.user = response.text();
});

En réaction, j'ai ceci:

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddCors(options =>
            {
                options.AddDefaultPolicy(
                    builder =>
                    {
                        builder.WithOrigins("http://localhost:3000").AllowAnyHeader().AllowAnyMethod();
                    });
            });
            //services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_3_0);
            services.AddControllers();
            services.AddAuthentication(IISDefaults.AuthenticationScheme);
            services.AddSwaggerGen();
        }

        // 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();
            }

            app.UseSwagger();
            app.UseSwaggerUI(c =>
            {
                c.SwaggerEndpoint("/swagger/v1/swagger.json", "MES vs API");
            });

            app.UseHttpsRedirection();
            app.UseRouting();
            app.UseCors("AllowAnyOrigin");
            app.UseAuthorization();
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }


7 commentaires

J'ai réussi à faire en sorte que l'appel API sur le client reste bloqué avec un statut (en attente). Il y a donc ......... que ...


Veuillez ouvrir la console de développement dans votre application react et vérifier l'appel HTTP sous l'onglet "Réseau" de la console. Sur l'appel spécifique, l'en-tête "Access-Control-Allow-Origin" est-il présent dans les en-têtes de réponse?


C'était jusqu'à ce que je déconne dans le Startup.cs - résultant en le code que j'ai publié. Maintenant, il reste en attente puis échoue finalement avec une erreur CONNECTION_RESET dans F12. Cela prend quelques minutes.


app.UseHttpsRedirection(); déplacez-le


le déplacer? Jusqu'où?


Je ne sais pas ce que tu veux dire @MuhammetCaylak


cette app.UseCors("AllowAnyOrigin") , app.UseSwagger() déplacer


3 Réponses :


0
votes

Vous effectuez des requêtes http mais vous avez activé HttpsRedirection.

Si vous développez sans https, vous devez déplacer l' app.UseHttpsRedirection(); appeler dans un bloc de code qui ne sera exécuté qu'en production. par exemple

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else // Production
    {
        app.UseHttpsRedirection();
    }

    app.UseSwagger();
    app.UseSwaggerUI(c =>
    {
        c.SwaggerEndpoint("/swagger/v1/swagger.json", "MES vs API");
    });

    app.UseRouting();
    app.UseCors(); // Use default policy as defined in example code
    //...

Vous ajoutez également une stratégie UseCors() par défaut, mais lorsque vous appelez UseCors() vous utilisez une stratégie nommée (AllowAnyOrigin).

Définissez une stratégie nommée "AllowAnyOrigin" ou appelez simplement app.UseCors(); pour utiliser la stratégie par défaut.

Documentation sur CORS dans .net core


2 commentaires

Cela change-t-il le fait qu'il peut fonctionner en mode http et https?


@MuhammetCaylak En développement à la fois http et https (si le certificat est installé). En production, il n'utilisera que https



0
votes

Pouvez-vous essayer de l'utiliser de cette façon?

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

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


0 commentaires

0
votes

J'utilise ceci pour le conteneur d'injection de dépendance lors de la définition de la stratégie CORS

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseRouting();

            //ALLOW CORS
            app.UseCors("CorsPolicy");

            app.UseAuthentication();
            app.UseAuthorization();

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

puis appliquer la politique CORS

            //CORS CONFIGURATION
            services.AddCors(options =>
            {
                options.AddPolicy("CorsPolicy",
                builder => builder.SetIsOriginAllowed(_ => true)
                .AllowAnyMethod()
                .AllowAnyHeader()
                .AllowCredentials());
            });


0 commentaires