[英]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.