【发布时间】:2017-06-10 04:24:30
【问题描述】:
这将与How does Access-Control-Allow-Origin header work? 重复,但那里的方法也不适用于我。我希望我只是错过了一些东西。
我试图在我的 .NET Core Web API 的响应中获取一个 Access-Control-Allow-Origin 标头,我通过 AJAX 访问它。
我已经尝试了几件事。除非另有说明,否则所有内容都在 Startup.cs 文件中。
方法一
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();
}
方法二
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 日星期三 04:51:48 GMT
服务器 →Kestrel
状态 → 200
变化 → 接受编码
x-powered-by → 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()
{
// ...
}
}
【问题讨论】:
-
您如何使用 Postman 访问服务器?仅针对 OPTIONS 请求返回标头
-
@Rob。这就是我所缺少的。在 Postman 方面较少(我也曾在 Chrome 中尝试过,并且使用了正确的方法),而在控制器方面则更多。我有
[HttpGet]而不是[HttpOptions]。我有一种感觉,它会像那样愚蠢。 -
@Rob,但是,Chrome 仍然失败。它收到 204 错误。邮递员完美地工作。两者都使用相同的 Bearer 令牌。 Chrome 中的缓存已禁用。
-
那.. 对我来说似乎不正确。您不必将控制器方法标记为
HttpOptions。您在方法 1 中的代码看起来是正确的(刚刚检查了我的本地项目,该项目有效)。我觉得 chrome 失败了,因为它缓存了飞行前的 OPTIONS 请求,而邮递员失败了,因为您没有发送 OPTIONS 请求。 -
即使缓存被禁用,您是否可以检查您的网络日志并检查是否实际发送了 OPTIONS 预检?
标签: c# asp.net-core cors asp.net-core-webapi cross-domain-policy