CORS:对预检请求的响应未通过访问控制检查:它没有 HTTP 正常状态
CORS: Response to preflight request doesn't pass access control check: It does not have HTTP ok status
我尝试做的事情以前工作得很好,我不知道发生了什么,也许他们在浏览器端更新了 CORS 策略
我正在尝试将文件上传到我的 ASP.NET 6 API,我的端点如下:
[HttpPost("uploadimage")]
public ActionResult<string> UploadImage(
[FromForm] IFormFile image,
[FromForm] int? days = 30,
[FromForm] MediaType? type = MediaType.AccountImage)
{
//do things
return url;
}
如果我尝试在 POSTMan 中调用它,它将正常工作并且 return URL。
但是当我尝试从我的浏览器调用它时,我得到了这个:
Access to fetch at 'http://localhost:15040/api/media/uploadimage' from origin
'http://localhost:5126' has been blocked by CORS policy: Response to preflight request
doesn't pass access control check: It does not have HTTP ok status.
这是我的 CORS 中间件配置:
ctx.Response.Headers.Add("Access-Control-Allow-Origin", "*");
ctx.Response.Headers.Add("Access-Control-Allow-Methods", "*");
ctx.Response.Headers.Add("Access-Control-Allow-Headers", "append,delete,entries,foreach,get,has,keys,set,values,Authorization,Origin, Content-Type, X-Auth-Token,Accept, X-Requested-With, Access-Control-Request-Method, Access-Control-Request-Headers");
我检查了邮递员并且 headers 存在。
我在服务器中设置了一个断点,请求甚至没有被发送到服务器,断点没有命中,方法也没有被调用...
这是我从客户端上传文件的代码:
var form = await file.GenerateImageForm();
var uri = new Uri("HTTP://localhost:15040/api/media/uploadimage");
var req = new HttpRequestMessage
{
Method = HttpMethod.Post,
Content = form,
RequestUri = URI,
};
req.Headers.Add("Allow-control-allow-origin", "*");
var ret = await HttpClient.SendAsync(req);
如何将我的文件上传到我的服务器?
您实现它的方式不同于 docs。
根据您提供的大量详细信息,很难判断哪里出了问题,但我的最佳猜测是您没有在端点上实施 OPTIONS
方法,导致它无法通过 pre-flight。
除非您有充分的理由不这样做,否则最好只选择文档中描述的选项:
builder.Services.AddCors(options =>
{
options.AddPolicy(name: MyAllowSpecificOrigins,
builder =>
{
builder.WithOrigins("http://example.com",
"http://www.contoso.com");
});
});
和
app.UseCors(MyAllowSpecificOrigins);
我尝试做的事情以前工作得很好,我不知道发生了什么,也许他们在浏览器端更新了 CORS 策略
我正在尝试将文件上传到我的 ASP.NET 6 API,我的端点如下:
[HttpPost("uploadimage")]
public ActionResult<string> UploadImage(
[FromForm] IFormFile image,
[FromForm] int? days = 30,
[FromForm] MediaType? type = MediaType.AccountImage)
{
//do things
return url;
}
如果我尝试在 POSTMan 中调用它,它将正常工作并且 return URL。 但是当我尝试从我的浏览器调用它时,我得到了这个:
Access to fetch at 'http://localhost:15040/api/media/uploadimage' from origin 'http://localhost:5126' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.
这是我的 CORS 中间件配置:
ctx.Response.Headers.Add("Access-Control-Allow-Origin", "*");
ctx.Response.Headers.Add("Access-Control-Allow-Methods", "*");
ctx.Response.Headers.Add("Access-Control-Allow-Headers", "append,delete,entries,foreach,get,has,keys,set,values,Authorization,Origin, Content-Type, X-Auth-Token,Accept, X-Requested-With, Access-Control-Request-Method, Access-Control-Request-Headers");
我检查了邮递员并且 headers 存在。 我在服务器中设置了一个断点,请求甚至没有被发送到服务器,断点没有命中,方法也没有被调用...
这是我从客户端上传文件的代码:
var form = await file.GenerateImageForm();
var uri = new Uri("HTTP://localhost:15040/api/media/uploadimage");
var req = new HttpRequestMessage
{
Method = HttpMethod.Post,
Content = form,
RequestUri = URI,
};
req.Headers.Add("Allow-control-allow-origin", "*");
var ret = await HttpClient.SendAsync(req);
如何将我的文件上传到我的服务器?
您实现它的方式不同于 docs。
根据您提供的大量详细信息,很难判断哪里出了问题,但我的最佳猜测是您没有在端点上实施 OPTIONS
方法,导致它无法通过 pre-flight。
除非您有充分的理由不这样做,否则最好只选择文档中描述的选项:
builder.Services.AddCors(options =>
{
options.AddPolicy(name: MyAllowSpecificOrigins,
builder =>
{
builder.WithOrigins("http://example.com",
"http://www.contoso.com");
});
});
和
app.UseCors(MyAllowSpecificOrigins);