繁体   English   中英

HTTP PATCH no 'Access-Control-Allow-Origin' header in ASP.NET Core 6

[英]HTTP PATCH no 'Access-Control-Allow-Origin' header in ASP.NET Core 6

查阅了Enable Cross-Origin Requests .NET 6的资料,无果。

这只会影响HttpPatch 当我在 Swagger 运行它时,没有问题。 当我尝试通过 3rd 方工具或CORS 测试工具进行测试时,出现错误。

该策略专用于已经提到的CORS 测试webapp。 这是代码:

builder.Services.AddCors(options =>
{
    options.AddPolicy(name: "MyAllowAllHeadersPolicy",
        policy =>
        {
            policy.WithOrigins("https://cors-test.codehappy.dev")
                .AllowAnyHeader()
                .AllowAnyMethod();
        });
});

当我运行测试时,每次都会收到此错误消息:它没有将access-control-allow-origin header 设置为* 没有这个 header,就不能通过用户浏览器向它发出来自其他域的请求。

我的所有其他路由都正常,因为我已使用以下 JSON 代码段在全局 Caddy 服务器上启用它们:

header {
  # enable HSTS
  Strict-Transport-Security max-age=31536000;
  # disable clients from sniffing the media type
  X-Content-Type-Options nosniff
  # clickjacking protection
  X-Frame-Options DENY
  # keep referrer data off of HTTP connections
  Referrer-Policy no-referrer-when-downgrade
  # Content-Security-Policy: default-src 'self'

  Access-Control-Allow-Origin *
  Access-Control-Allow-Credentials true
  Access-Control-Allow-Methods *
  Access-Control-Allow-Headers *
}

在使用PATCH的 Controller 中的特定路线上(只有 1 个 controller 对 1 项使用 PATCH) ,我也有这段代码(缩写以显示注释)

[EnableCors("MyAllowAllHeadersPolicy")]
[HttpPatch("{id:int}")]
public async Task<IActionResult> PatchAsync(int id, ...

来自浏览器的控制台中的长错误消息是:

Access to XMLHttpRequest at 'https://web.site' from origin 'http://localhost:4200'
has been blocked by CORS policy: Response to preflight request doesn't pass access
control check: It does hot have HTTP ok status.

我不想发布整个 URI,因为这会暴露我的 API 并且在它处于开发模式时没有授权设置,因此 URL 仅供示例之用。

理想情况下,我想在 WebApi 项目的服务器端处理preflight request ,因此它返回 HTTP 状态代码 200,以便浏览器继续发送实际请求。

我已经阅读了很多文档并尝试了不同的策略,将其设置为允许所有,但无济于事。

有没有人可以指出我正确的方向来解决这个问题?

我的替代方案是获取 object 的副本,并将其作为 object 顶部的 PUT 命令重新发布回 API。这以前有效,但处理请求的开销很大。 :-(

要启用HTTP PATCH ,我参考了这篇 Microsoft 文章: as.net Core 6 JsonPatch

我创建了一个 .net 6 MVC 应用程序,在我的 controller 中,我按照您提到的文档添加了这样的请求:

[HttpPatch]
public IActionResult JsonPatchWithModelState([FromBody] JsonPatchDocument<Customer> patchDoc)
{
    if (patchDoc != null)
    {
        var customer = new Customer {
            customerName = "a"
        };

        patchDoc.ApplyTo(customer, ModelState);

        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        return new ObjectResult(customer);
    }
    else
    {
        return BadRequest(ModelState);
    }
}

然后在 Program.cs 中,添加 cors 策略:

builder.Services.AddControllersWithViews().AddNewtonsoftJson();
builder.Services.AddCors(options =>
{
    options.AddPolicy(name: "MyAllowAllHeadersPolicy",
        policy =>
        {
            //policy.WithOrigins("https://cors-test.codehappy.dev")
            policy.AllowAnyOrigin()
                .AllowAnyHeader()
                .AllowAnyMethod();
        });
});
...
..
.
app.UseRouting();
app.UseCors("MyAllowAllHeadersPolicy");

现在在您提到的工具中进行测试:

在此处输入图像描述

但是当我创建一个 SPA 来测试 api

$("#btn2").click(function() {
    alert(2);
    $.ajax({
        headers : {
            'Accept' : 'application/json',
            'Content-Type' : 'application/json'
        },
        url : 'https://localhost:7151/home/JsonPatchWithModelState',
        type : 'PATCH',
        data : JSON.stringify({customerName: "xxxx"}),
        success : function(data) {
            alert("OK");
        },
        error : function(data) {
            alert("error");
        }
    });
});

可以访问api。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM