To byłby duplikat How does Access-Control-Allow-Origin header work?, ale metoda tam również nie działa dla mnie. Mam nadzieję, że czegoś mi brakuje..NET Core UseCors() nie dodaje nagłówków
Próbuję uzyskać nagłówek Access-Control-Allow-Origin
w mojej odpowiedzi z mojego .NET Core Web API, do którego uzyskuję dostęp przez AJAX.
Próbowałem kilku rzeczy. Wszystkie, o ile nie zaznaczono inaczej, znajdują się w pliku Startup.cs
.
Metoda 1
Jak na Microsoft Documentation:
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();
}
Metoda 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");
// ...
}
Próbowałem zostały również dodanie [EnableCors("AllowWebApp")]
zarówno na kontrolerze i metody.
Od Postman, otrzymuję:
zawartość kodowanie → gzip
Content-Type → text/plain; charset = UTF-8
data → Wed, 25 Jan 2017 04:51:48 GMT
serwer → Kestrel
stan → 200
zmieniać → Accept-Encoding
x-zasilane przez → ASP.NET
x-sourcefiles → =? UTF-8? B? [ZMIENIONO]
Próbowałem również w Chrome i uzyskałem podobne nagłówki.
Jeśli jest to ważne, metoda, do której próbuję uzyskać dostęp, ma atrybut Authorize
. Ale ta część powinna działać poprawnie (przynajmniej otrzymuję dobrą odpowiedź)
Czy brakuje mi czegoś oczywistego, czy to się zepsuło? Obecnie korzystam z wersji 1.1.0.
Edit dodanie JS i Controller 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();
}
Controller Stub
[Authorize]
[Route("api/[controller]")]
public class UserController : ApiController
{
[HttpGet(nameof(ContactsPreview))]
[EnableCors("AllowWebApp")]
public IEnumerable<Customer> ContactsPreview()
{
// ...
}
}
W jaki sposób trafiasz na serwer z Postmanem? Nagłówek zostanie zwrócony tylko dla żądania OPTIONS – Rob
@Rob. Tego właśnie mi brakowało. W mniejszym stopniu na stronie Postmana (próbowałem go również w Chrome, i to było przy użyciu właściwej metody), a jeszcze bardziej po stronie kontrolera. Miałem '[HttpGet]' zamiast '[HttpOptions]'. Miałem przeczucie, że to coś tak głupiego. – David
@Rob, jednak Chrome wciąż nie działa. Występuje błąd 204. Listonosz działa idealnie. Oba używają tego samego znacznika okaziciela. Pamięć podręczna jest wyłączona w przeglądarce Chrome. – David