最近在做基于net core 3.1的跨域问题,发现在进行put请求时notice预请求已通过,但是正式请求被屏蔽,返回405 method not allow.
method已经在startup中配置完毕,已允许put请求,但是还是不能正常执行,目前完全不知道问题在哪,请问各位谁有比较好的解决方案?
以下是配置的代码和状况截图
请大家帮忙给看看吧,提前谢谢诸位大神
首先感谢大家的多多关注,感谢以上所有的答案,经过仔细测试,目前以上四个解决方案都无法解决无法跨域发送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 项目更加整洁。
最后仍然向所有给予回答的参与者以极大的感谢,这个问题也会持续关注,如有发现新的更好的解决方案必定会同大家一同分享。
是放在 iis 么?
是的话,
<modules runAllManagedModulesForAllRequests="false">
<remove name="WebDAVModule" />
</modules>
加在 <system.webServer> 节点下
@小小高: 在 web.config 中
先试试这个,定位一下是不是这段的问题:
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();
前端设置了 获允许发送凭据吗?如果设置了 需要加上 AllowCredentials
后端把前端的域名加到配置里就行了啊
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)));
});
}
你的option请求的接口是49999,响应返回允许的端口是4200,但是你的api发送的端口还是49999。端口号不一致吧?
抱歉,看错了。是4200发起的对49999的请求。
这个响应的信息应是告诉你你请求的url本来就不支持put(只有get,delete和patch),你如果绕过浏览器直接用curl发起put请求相信应该也是405。这个就和cors无关了。
@blackheart: 请看一下OPTIONS请求,它的跨域设置是允许PUT的,而这个设置应该是能够贯穿跨域请求的全过程的,结果现在我的请求中跨域的设置在第二次发送真正PUT请求时原来允许通过的PUT请求被屏蔽了,而在配置项是无法对第二次真实请求进行干预的,所以跨域请求失败。目前没有办法,只能是put改为post了
@blackheart: 这些methodd都是经过postman测试通过的的,如果非cors都是可以正常请求的,也都是可以正常响应的,只是在跨域的过程中put请求不能正常执行,目前采用了post请求替代的方法实现put的功能,这个问题也反馈给了netcore官方社区,目前也没有一个可行的回复,至今是和浏览器有关还是和代码有关一直就没弄明白
@白衣若雪来去如风: 有demo不?
@blackheart: 实际工作中的项目,没办法发给你,不过还是十分感谢!