我知道这个结束了。我已经研究了类似问题的其他答案,如果没有运气的话。
我相当确定我已正确启用CORS以允许来自所有来源的传入请求(在本例中为POST请求),但我看到以下错误:
无法加载http://localhost:5000/expenses:否 '访问控制允许来源'标题出现在请求的上 资源。起源' http://localhost:4200'因此是不允许的 访问。响应的HTTP状态代码为500。
以下是我在webAPI项目中启用CORS的方法:
Startup.cs中的相关方法
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddCors();
services.AddMvc();
services.AddDbContext<ExpensesDbContext>(options =>
options.UseMySQL(Configuration.GetConnectionString("DefaultConnection")));
services.AddTransient<IBaseDa<Accounts>, AccountsDataAccess>();
services.AddTransient<IExpensesDa, ExpensesDa>();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
env.EnvironmentName = "Development";
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseCors(builder => builder
.AllowAnyHeader()
.AllowAnyMethod()
.AllowAnyOrigin()
.AllowCredentials());
app.UseMvc();
}
如果我正在使用.AllowAnyOrigin()
和.AllowAnyMethod()
,为什么我会看到上述错误?
答案 0 :(得分:1)
netCore2.0(http://localhost:5000/)+ Angular(http://localhost:4200)+ chrome = Access-Control-Allow-Origin的组合。我之前遇到过这个问题,我花了3天时间才意识到chrome总会抛出这个错误。我认为这是因为chrome将localhost视为无视端口的起源,即使中间件明确地告诉它不要特别关于POST请求。
我会尝试在startup.cs中定义一个策略配置服务:
public void ConfigureServices(IServiceCollection services)
{
//add cors service
services.AddCors(options => options.AddPolicy("Cors",
builder =>
{
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();
}));
然后在你的Configure方法中我会添加:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
//authentication added
app.UseAuthentication();
app.UseCors("Cors");
app.UseMvc();
}
...这很可能不会工作,但尝试任何人....这让我疯了,我需要满意的看看请求是否甚至试图打到asp.netCore后端: 我用了
如果你真的想看到我会清除你的缓存和cookie然后添加 IHttpContextAccessor可以对请求中发生的事情进行低级控制。 在我遇到同样问题的困境中,我需要角度来发送图像。我正在接受这种感觉 原因错误然后通过exprimenting我通过将IHttpContextAccessor注入我的控制器获得了Image
public void ConfigureServices(IServiceCollection services)
{
//add cors service
services.AddCors(options => options.AddPolicy("Cors",
builder =>
{
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();
}));
services.AddMvc();
// register an IHttpContextAccessor so we can access the current
// HttpContext in services by injecting it
//---we use to this pull out the contents of the request
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
}
你想将它注入任何控制器
public class HomeController : Controller
{
// make a read only field
private readonly IHttpContextAccessor _httpContextAccessor;
//create ctor for controller and inject it
public UserService(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
// now in your post method use this to see what the if anything came in through the request:
public async Task<IActionResult> Picload(IFormFile file){//---always null
// in my problem I was loading and image from.
var file = _httpContextAccessor.HttpContext.Request.Form.Files[0];
}
使用它,它让我访问图像chrome给我一个Origin错误。
答案 1 :(得分:1)
在这种情况下我挠了一段时间。我已正确启用了CORS,但某些调用仍返回Access-Control-Allow-Origin错误。我发现了问题...偷偷摸摸的问题...
我们的问题是由我们如何使用app.UseExceptionHandler
引起的。具体来说,这是我们正在使用的代码,除了我们的原始代码没有context.Response.Headers.Add("Access-Control-Allow-Origin", "*");
行。
app.UseExceptionHandler(errorApp =>
{
errorApp.Run(async context =>
{
var errorFeature = context.Features.Get<IExceptionHandlerFeature>();
var exception = errorFeature.Error;
var problemDetails = new ProblemDetails
{
Title = R.ErrorUnexpected,
Status = status,
Detail =
$"{exception.Message} {exception.InnerException?.Message}"
};
context.Response.Headers.Add("Access-Control-Allow-Origin", "*");
context.Response.StatusCode = problemDetails.Status.GetValueOrDefault();
context.Response.WriteJson(problemDetails, "application/problem+json");
await Task.CompletedTask;
});
});
app.UseExceptionHandler
是比控制器操作低得多的功能,因此不参与与本机相关的任何CORS。添加context.Response.Headers.Add("Access-Control-Allow-Origin", "*");
可以解决此问题。
答案 2 :(得分:0)
我的水晶球告诉我,您的C#代码中的某个位置在执行时出现错误,因此该服务的“返回”语句永远不会执行。因此,请调试代码并修复错误,以便将响应返回到浏览器。