实际上,这不是重复帖子,我知道在stackoverflow社区中多次询问过的标题的一部分,我阅读了所有帖子和答案,但我认为我的问题和答案是我使用的技术是不同的。
首先我要提到ASP.NET Core WEB/API
是我的后端应用程序,Reactjs
是我的前端应用程序。
我了解了CORS
,发现必须在CORS
应用程序上启用ASP.NET
并将'Access-Control-Allow-Origin':'*'
放在请求的标头上,但在执行此操作时仍然出现以下错误我叫一个api:
请求的请求上没有'Access-Control-Allow-Origin'标头 资源。因此,不允许原点“ http://localhost:8080” 访问。响应的HTTP状态码为500。如果响应不透明 满足您的需求,将请求的模式设置为“ no-cors”以获取 禁用了CORS的资源。
这是我与Startup.cs
相关的CORS
代码:
public void ConfigureServices(IServiceCollection services)
{
// other lines of code
services.AddCors(options =>
{
options.AddPolicy("AllowAll",
builder =>
{
builder
.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();
});
});
services.Configure<MvcOptions>(options =>
{
options.Filters.Add(new CorsAuthorizationFilterFactory("AllowAll"));
});
// other lines of code
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
app.UseCors("AllowAll");
app.UseAuthentication();
app.UseMvc();
}
这是我的反应代码:
function save(message) {
const requestOptions = {
method: 'POST',
mode: 'cors',
headers: { ...authHeader(),
'Content-Type': 'application/json',
'Access-Control-Allow-Origin':'*',
},
body: JSON.stringify(message)
};
return fetch(config.apiUrl + '/message/save', requestOptions).then(handleResponse, handleError);
}
感谢您的答复。
答案 0 :(得分:9)
我最近有一个类似的问题。就我而言,当我在services.AddCors();
方法和这部分代码
ConfigureServices
时,它开始工作
app.UseCors(builder => builder
.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials());
在我的Configure
方法中。请记住,在两种情况下,都必须添加这些之前 UseMvc()调用。
答案 1 :(得分:4)
经过两天的苦难,我终于找到了解决问题的方法。实际上,您的评论之一对我来说是个很好的线索。
@ kirk-larkin说:
此处的响应具有HTTP状态代码500是关键。如果您的ASP.NET Core项目中存在异常,则会清除CORS标头。您应该尝试找出引发异常的原因。
我跟踪了很多次代码,然后发现我忘记在Startup.cs中注册我的控制器中使用的服务。
我在Startup.cs中调用了以下代码,问题得以解决。
services.AddScoped<IMessageService, MessageService>();
答案 2 :(得分:2)
对于ASP.NET Core 2.1,当控制器引发异常(导致错误500)时,将不发送CORS标头。该问题应在下一版本中修复,但在此之前,您可以使用中间件来解决此问题。
请参见
还要注意,由于大多数浏览器只是忽略了凭据,因此您需要使用凭据显式添加带有主机和端口的WithOrigins
(请参见https://stackoverflow.com/a/19744754/2477619):
app.UseCors(builder =>
builder
.WithOrigins("http://localhost:4200")
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials()
);
答案 3 :(得分:0)
制作应用程序时遇到了同样的问题。我下载了这个chrome扩展程序,问题就消失了。也许对您有帮助?
https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi
答案 4 :(得分:0)
正如@Siavash 所说,它返回 500 的事实可能表明构建存在问题。我今天遇到了这个问题,因为它在本地主机上运行良好,但在部署时失败了。
要调试错误,请在 IIS 目录根目录下的 web.config 文件中找到以下行:
<aspNetCore processPath="dotnet" arguments=".\CarpetrightBackend.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" />
将 stdoutLogEnabled="false" 更改为 true,然后您将能够在生成的日志文件中看到错误。
在我的情况下,我在部署时忘记包含一些静态 csv 文件,该程序需要从中引用和返回数据。