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);