這將是How does Access-Control-Allow-Origin header work?的重複,但那裏的方法也不適合我。我希望我只是錯過了一些東西。.NET核心UseCors()不添加標頭
我想在我的.NET Core Web API(我通過AJAX訪問)的響應中得到一個Access-Control-Allow-Origin
頭文件。
我試了幾件事。除非另有說明,所有文件都在Startup.cs
文件中。
方法1
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();
}
方法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");
// ...
}
我也試着對控制器和方法都加入[EnableCors("AllowWebApp")]
。
從郵差,我得到:
內容編碼
→gzip的
內容類型→文本/無格式;字符集= UTF-8
日期→星期三,2017年1月25日4時51分48秒GMT
服務器→茶隼
狀態→200
變化→接受編碼
的x通電由→ASP.NET
x-sourcefiles→=?UTF-8?B [編輯]
我也在Chrome中試過它,並且得到了類似的頭文件。
如果很重要,我試圖訪問的方法有一個Authorize
屬性。但那部分應該工作正常(我至少得到了一個很好的迴應)
所以,我是否錯過了一些非常明顯的東西,或者這是否會被打破?我目前正在運行版本1.1.0。
編輯添加JS和控制器存根
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();
}
控制器存根
[Authorize]
[Route("api/[controller]")]
public class UserController : ApiController
{
[HttpGet(nameof(ContactsPreview))]
[EnableCors("AllowWebApp")]
public IEnumerable<Customer> ContactsPreview()
{
// ...
}
}
你怎麼打郵遞員服務器?標題只會返回一個OPTIONS請求 – Rob
@Rob。這就是我所錯過的。 Postman方面的情況並不如此(我曾在Chrome中嘗試過,並且使用了正確的方法),在控制器方面更是如此。我有'[HttpGet]'而不是'[HttpOptions]'。我有一種感覺,那就是那種愚蠢的東西。 – David
@Rob,但Chrome仍然失敗。它出現了204錯誤。郵差工作完美。兩者都使用相同的持票人令牌。 Chrome中禁用緩存。 – David