问题:
最近在做基于net core 3.1的跨域问题,发现在进行put请求时notice预请求已通过,但是正式请求被屏蔽,返回405 method not allow.
method已经在startup中配置完毕,已允许put请求,但是还是不能正常执行,目前完全不知道问题在哪,请问各位谁有比较好的解决方案?
以下是配置的代码和状况截图
请大家帮忙给看看吧,提前谢谢诸位大神
回答1:
首先感谢大家的多多关注,感谢以上所有的答案,经过仔细测试,目前以上四个解决方案都无法解决无法跨域发送put请求的方法,并且经过测试,无论是手动编写代码配置跨域亦或是使用CORS中间件都无法配置跨域请求能够通过put请求。主要还是有以下前提,首先,这里要发送的get请求并不是简单请求,所以每次请求前都需要通过option请求获取跨域确认请求,之后在跨域确认通过后,发起第二次(即实际发起put请求时)put 请求谓词被自动拦截,至今未找到合适的解决方式,不知道是请求受缓存策略还是受跨域所限制。
这个问题的最后解决方案:采用post请求替换put请求,同时webapi的设置放弃了restful的风格,采用自定义的I(Index)C(Create)R(Read)U(Update)D(Delete)E(Expand)方式实现通过Webapi对数据库数据的缓存和持久化方案,同时调用WebApi时更加清晰明了,请求谓词规划更加清晰,对单个数据库表的数据操作方式也更加一致,前端的调用也更加方便。虽然没有解决遇到的问题,但是通过迂回策略反而使整个webapi 项目更加整洁。
最后仍然向所有给予回答的参与者以极大的感谢,这个问题也会持续关注,如有发现新的更好的解决方案必定会同大家一同分享。
回答2:
先试试这个,定位一下是不是这段的问题:
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();
回答3:
https://www.cnblogs.com/gaocong/p/10102838.html
用我这个试试
回答4:
前端设置了 获允许发送凭据吗?如果设置了 需要加上 AllowCredentials
回答5:
后端把前端的域名加到配置里就行了啊
public IServiceProvider ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
{
options.AddPolicy("AllowSpecificOrigin",
b => b.WithOrigins("http://localhost:4200", "http://localhost:4500", "http://localhost:4201")
.AllowAnyHeader()
.AllowAnyMethod().AllowCredentials()
.WithExposedHeaders("Content-Disposition") //用户导出excel客户端获取文件名
.SetPreflightMaxAge(TimeSpan.FromDays(1)));
options.AddPolicy("AllowAllOrigins",
b => b.AllowAnyOrigin()
.AllowAnyHeader()
.AllowAnyMethod().AllowCredentials()
.WithExposedHeaders("Content-Disposition") //用户导出excel客户端获取文件名
.SetPreflightMaxAge(TimeSpan.FromDays(1)));
});
}