Web API对application/json内容类型的CORS支持
假设有一简单架构分为前后两部分,其一是Angular构成的前端页面站点,另一个则是通过ASP.NET Web API搭建的后端服务站点。两个站点因为分别布署,所有会有CORS(Cross-Origin Resource Sharing)的问题。
再假设后端已经对此做好相应配置,比如在web.config里加上了:
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="GET, PUT, POST, DELETE, HEAD" />
<add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept" />
</customHeaders>
</httpProtocol>
那么当前端调用后端接口:
save(data: any) : Observable<any> {
return this.http.post(`${this.apiUrl}`, data)
}
后端对应接口内的逻辑理论上应该是能够被正常执行的:
[HttpPost]
[Route("api/save")]
public HttpResponseMessage Save(SomeModel model)
{
//内部逻辑
}
但结果是出现了Message:"The requested resource does not support http method 'OPTIONS'."
错误。
产生此问题的原因在于HttpClient的post方法默认是采用application/json的内容类型(Content-Type)。
而CORS规范中有两种类型:
- Simple requests
- Preflighted requests
前者无需额外的处理,但对于内容类型的支持,仅限三种:
- application/x-www-form-urlencoded
- multipart/form-data
- text/plain
对于除此以外的内容类型,比如application/json,CORS会以预检请求方式(Preflighted requests)处理。
Preflighted requests要求必须首先使用OPTIONS方法发起一个预检请求到服务器,以获知服务器是否允许该实际请求。
而在上面的后端服务代码中并没有准备相应的处理OPTIONS请求的接口,所以才会有这样的错误。
对应修正方法很简单,在同一接口方法上加上处理OPTIONS请求的逻辑:
[HttpOptions, HttpPost]
[Route("api/save")]
public HttpResponseMessage Save(SomeModel model)
{
if (Request.Method == HttpMethod.Options) return new HttpResponseMessage(HttpStatusCode.OK);
//内部逻辑
}
有关CORS的详细描述,建议参考官方文档——Cross-Origin Resource Sharing (CORS)
作者:Ken.W
出处:http://www.cnblogs.com/kenwoo
本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。
出处:http://www.cnblogs.com/kenwoo
本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。
分类:
Technology
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· Qt个人项目总结 —— MySQL数据库查询与断言