c# - 为什么从 React 到 WebAPI 运行此 PATCH 方法时会出现 CORS 错误?
问题描述
所以这是我的 Cors 初始化代码:
app.UseCors(builder =>
builder.AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin());
然而,当我运行 PATCH 时,我在 Chrome 83 中收到以下错误:
从源“https://users-dev.myproject.com”获取“https://api-dev.myproject.com/api/mp”的访问权限已被 CORS 策略阻止:否“访问控制允许” -Origin' 标头存在于请求的资源上。如果不透明的响应满足您的需求,请将请求的模式设置为“no-cors”以获取禁用 CORS 的资源。
这是调用 api 的代码(来自 React):
const response = await fetch(API_URL() + `/mp`, {
method: 'PATCH',
body: `"${JSON.stringify(mpForm.values)}"`,
headers: {
Authorization: 'Bearer ' + apiToken,
'Content-type': 'application/json'
}
});
这里可能出了什么问题?对这个域的大多数 API 请求都很好。目前只有这一个。
更新
万一你遇到这个确切的问题,这个问题的根本原因是身体线:
body: `"${JSON.stringify(mpForm.values)}"`,
并且通过重构 API 以使用这样的主体来解决问题:
body: JSON.stringify(mpForm.values),
这是一个问题的原因是 stringify 函数在返回值中嵌入了双引号,导致传递这样的字符串:
'"{"foo":"bar"}"'
然后导致CORS错误。
解决方案
您的 CORS 配置看起来是正确的,如果某些请求有效,但其他请求无效,则问题可能根本不在 API 端。
在 API startup.cs中,确保在所有其他配置之前配置了 CORS。
app.UseCors(builder => builder .AllowAnyOrigin() .AllowAnyMethod() .AllowAnyHeader()
此代码是有效的,虽然不是很安全,但它将满足您应用的全局浏览器 CORS 协议
确保在整个 API 中没有冲突的 CORS 配置,在控制器或方法上查找失败的请求的单个 CORS 配置。
检查客户端,虽然您的客户端代码看起来不错,但主体是从变量中注入的,为了解决任何客户端到服务器的问题,您需要以纯文本形式记录完整请求,或者从您的网络流量检查工具中检索它运行时的网络浏览器。
如果对您的 API 的大多数查询都正确解决并且只有一两个失败,这很好地表明客户端存在问题,您可能应该从这里开始。
更新:
OP 的问题根本与 CORS 没有直接关系,但它很好地提醒了两个重要的教训:
格式错误的请求 Web API 在生成对请求的正确响应之前可能会失败
OPTIONS
,如果OPTIONS
请求没有按照规范响应,浏览器将首先将此报告为 CORS 拒绝问题,从而抑制来自 API 的真正错误响应在向论坛发布问题以寻求解决错误的建议时,提供导致错误的代码仅描绘了部分情况。您需要包含显示运行时值以及实际错误消息的日志。
- 为了调试客户端和服务器之间的任何 Web API 问题,您应该始终查看受影响调用的实际 HTTP 请求和响应内容和标头,您可以使用浏览器开发工具查看网络跟踪,但是如果您需要定期调试问题像这样在生产中,您应该考虑在客户端或服务器端进行请求跟踪日志记录。
推荐阅读
- flutter - 使 showModalBottomSheet() 高度根据内容调整
- flutter - 这里我的列表视图没有滚动飞镖颤振,请帮助我我是颤振新手
- javascript - 有人可以向我解释为什么这种语法使用括号而不是大括号,在 reduce 方法中添加逗号并且不再“返回”吗?
- excel - 求和公式在单独的 Evaluate 函数中工作,但不能组合
- python - 什么会导致迭代 PyTrend 关键字的此函数的范围列表索引?
- javascript - 确保没有选择两次随机 javascript 对象选择
- swift - 将非泛型 ObjC 类向上转换为 Swift 方法参数的父类
- r - 从定义范围 [min, max] 的泊松分布生成随机数
- php - 如何从数据库中获取更新的值而不是默认值?- Laravel,Mysql
- spring-integration - 使用弹簧集成的 JMS 连接出错