.NET de Base UseCors() ne pas ajouter des en-têtes

Ce serait un doublon de Comment Access-Control-Allow-Origin-tête de travail?, mais la méthode il n'y a pas de travail pour moi. J'espère que je suis juste en manque de quelque chose.

Je suis en train d'essayer d'obtenir un Access-Control-Allow-Origin d'en-tête dans ma réponse à partir de mon .NET Web de Base de l'API, dont je suis l'accès via AJAX.

J'ai essayé plusieurs choses. Tous, sauf indication contraire, ont été dans le Startup.cs fichier.

Méthode 1

Que par la La Documentation De Microsoft:

public void ConfigureServices(IServiceCollection services)
{
    //Add database
    services.AddDbContext<DbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DbConnection")));

    //Add the ability to use the API with JSON
    services.AddCors();

    //Add framework services.
    services.AddMvc();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();

    if (env.IsDevelopment())
    {
        using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope())
        {
            serviceScope.ServiceProvider.GetService<DbContext>().Database.Migrate();
            serviceScope.ServiceProvider.GetService<DbContext>().EnsureSeedData();
        }
    }

    app.UseCors(builder => builder.WithOrigins("https://localhost:44306").AllowAnyMethod());

    app.UseJwtBearerAuthentication(new JwtBearerOptions
    {
        Authority = Configuration["Authentication:AzureAd:AADInstance"] + Configuration["Authentication:AzureAd:TenantId"],
        Audience = Configuration["Authentication:AzureAd:Audience"],
    });

    app.UseMvc();
}

Méthode 2

public void ConfigureServices(IServiceCollection services)
{
    //...

    services.AddCors(options => options.AddPolicy("AllowWebApp",
        builder => builder.AllowAnyMethod()
                          .AllowAnyMethod()
                          .AllowAnyOrigin()));
                          //.WithOrigins("https://localhost:44306")));

    //...
}

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

    app.UseCors("AllowWebApp");

    //...
}

J'ai aussi essayé d'ajouter [EnableCors("AllowWebApp")] sur le Contrôleur et Méthode.

De Facteur, j'obtiens:

encodage de contenu → gzip

content-type → text/plain; charset=utf-8

date → Wed, 25 Jan 2017 04:51:48 GMT

serveur →Kestrel

statut → 200

varier → Accept-Encoding

x-powered-by → ASP.NET

x-sourcefiles → =?UTF-8?B?[EDITE]

Je l'ai aussi essayé en Chrome, et il est devenu semblable en-têtes.

Si c'est important, la méthode que je suis en train d'essayer d'accéder a un Authorize attribut. Mais cette partie doit être fonctionne bien (je suis au moins d'obtenir une bonne réponse)

Donc, suis-je raté quelque chose de très évident, ou n'avait-il cassé? Je suis actuellement en cours d'exécution de la version 1.1.0.


Modifier l'ajout de JS et de Contrôleur de Stub

function getContactPreviews(resultsCallback) {
    var xmlhttp = new XMLHttpRequest();

    xmlhttp.onreadystatechange = () => {
        if (xmlhttp.readyState == XMLHttpRequest.DONE && xmlhttp.status == 200) {
            resultsCallback(JSON.parse(xmlhttp.response));
        }
    }

    xmlhttp.open("GET", "https://localhost:44357/api/User/ContactsPreview", true);
    xmlhttp.setRequestHeader("Authorization", "Bearer " + localStorage.getItem("AuthorizationToken"));
    xmlhttp.send();
}

Contrôleur De Stub

[Authorize]
[Route("api/[controller]")]
public class UserController : ApiController
{
    [HttpGet(nameof(ContactsPreview))]
    [EnableCors("AllowWebApp")]
    public IEnumerable<Customer> ContactsPreview()
    {
        //...
    }
}
  • Comment êtes-vous de frapper le serveur avec Facteur? L'en-tête ne sera retourné pour une demande d'OPTIONS
  • C'est ce qui me manquait. Moins sur le Facteur de côté (je l'avais essayé dans google Chrome en tant que bien, et qui a été à l'aide de la méthode correcte), et plus sur le contrôleur de côté. J'ai eu [HttpGet] au lieu de [HttpOptions]. J'ai eu le sentiment que ça serait quelque chose de stupide comme ça.
  • cependant, le Chrome est toujours à la peine. Il se fait un 204 erreur. Facteur fonctionne parfaitement. Les deux utilisent le même Porteur du jeton. Le Cache est désactivé dans le navigateur Chrome.
  • Que.. ne semble pas correct pour moi. Vous ne devriez pas avoir de marque de votre méthode de contrôleur comme HttpOptions. Votre code dans la Méthode 1 semble correct (juste vérifié à l'encontre de mon projet local, qui fonctionne). J'ai envie de chrome n'était pas parce qu'il cache de la préparation du vol des OPTIONS de la demande, et le facteur n'était pas parce que vous n'étiez pas envoyer une demande d'OPTIONS.
  • Même si le cache est désactivé, vous pouvez inspecter votre journal de réseau et vérifiez que les OPTIONS de contrôle en amont a été envoyé?
  • Notez également que 204 n'est pas une erreur. 204 est un code de succès, cela signifie que le serveur n'avait pas de données.
  • Oui, je sais, sur les 204 partie. Mais il faudrait des données. L'API retourne quelques JSON. De toute façon, c'est à l'aide de la méthode des options. Voici ce que google Chrome est de montrer: imgur.com/a/M2FJx
  • Ok, donc 204 est prévu dans ce cas que c'est le contrôle en amont de la demande avant l'envoi de la demande réelle. Quelles sont les méthodes que votre contrôleur de l'action de l'accepter? Avez-vous explicitement marqué comme HttpPost si c'est une méthode post par exemple?
  • Laissez-nous continuer cette discussion dans le chat.
  • merci pour ça, google Chrome a été mise en cache les OPTIONS de contrôle en amont du demande dans mon cas, et en désactivant le cache résolu

InformationsquelleAutor David | 2017-01-25