首页 新闻 会员 周边

webapi跨域的请求屏蔽问题

0
悬赏园豆:20 [已解决问题] 解决于 2020-07-24 09:44

最近在做基于net core 3.1的跨域问题,发现在进行put请求时notice预请求已通过,但是正式请求被屏蔽,返回405 method not allow.
method已经在startup中配置完毕,已允许put请求,但是还是不能正常执行,目前完全不知道问题在哪,请问各位谁有比较好的解决方案?
以下是配置的代码和状况截图

请大家帮忙给看看吧,提前谢谢诸位大神

若雪白衣的主页 若雪白衣 | 初学一级 | 园豆:186
提问于:2020-07-08 17:13
< >
分享
最佳答案
0

首先感谢大家的多多关注,感谢以上所有的答案,经过仔细测试,目前以上四个解决方案都无法解决无法跨域发送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 项目更加整洁。
最后仍然向所有给予回答的参与者以极大的感谢,这个问题也会持续关注,如有发现新的更好的解决方案必定会同大家一同分享。

若雪白衣 | 初学一级 |园豆:186 | 2020-07-24 09:39

 是放在 iis 么? 

是的话,

<modules runAllManagedModulesForAllRequests="false">
<remove name="WebDAVModule" />
</modules>

小小高 | 园豆:1095 (小虾三级) | 2020-07-24 18:02

加在  <system.webServer> 节点下

小小高 | 园豆:1095 (小虾三级) | 2020-07-24 18:04

@小小高: 在 web.config 中

小小高 | 园豆:1095 (小虾三级) | 2020-07-24 18:07
其他回答(5)
0

先试试这个,定位一下是不是这段的问题:
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();

猝不及防 | 园豆:2731 (老鸟四级) | 2020-07-09 09:39
0
收获园豆:20
小小高 | 园豆:1095 (小虾三级) | 2020-07-09 10:55
0

前端设置了 获允许发送凭据吗?如果设置了 需要加上 AllowCredentials

gt1987 | 园豆:1150 (小虾三级) | 2020-07-09 11:18
0

后端把前端的域名加到配置里就行了啊
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)));
        });

}

李0539 | 园豆:442 (菜鸟二级) | 2020-07-11 13:59
0

你的option请求的接口是49999,响应返回允许的端口是4200,但是你的api发送的端口还是49999。端口号不一致吧?

Timetombs | 园豆:3954 (老鸟四级) | 2020-07-24 13:19

抱歉,看错了。是4200发起的对49999的请求。

支持(0) 反对(0) Timetombs | 园豆:3954 (老鸟四级) | 2020-07-24 13:25

这个响应的信息应是告诉你你请求的url本来就不支持put(只有get,delete和patch),你如果绕过浏览器直接用curl发起put请求相信应该也是405。这个就和cors无关了。

支持(0) 反对(0) Timetombs | 园豆:3954 (老鸟四级) | 2020-07-24 13:29

@blackheart: 请看一下OPTIONS请求,它的跨域设置是允许PUT的,而这个设置应该是能够贯穿跨域请求的全过程的,结果现在我的请求中跨域的设置在第二次发送真正PUT请求时原来允许通过的PUT请求被屏蔽了,而在配置项是无法对第二次真实请求进行干预的,所以跨域请求失败。目前没有办法,只能是put改为post了

支持(0) 反对(0) 若雪白衣 | 园豆:186 (初学一级) | 2020-08-03 13:23
@白衣若雪来去如风: 那是你cors配置的允许的所有method,并不是你的URL就支持put。我的意思是你这个URL是不是本来就没有put, curl试一下就可以验证出来。
支持(0) 反对(0) Timetombs | 园豆:3954 (老鸟四级) | 2020-08-03 15:26

@blackheart: 这些methodd都是经过postman测试通过的的,如果非cors都是可以正常请求的,也都是可以正常响应的,只是在跨域的过程中put请求不能正常执行,目前采用了post请求替代的方法实现put的功能,这个问题也反馈给了netcore官方社区,目前也没有一个可行的回复,至今是和浏览器有关还是和代码有关一直就没弄明白

支持(0) 反对(0) 若雪白衣 | 园豆:186 (初学一级) | 2020-08-04 10:30

@白衣若雪来去如风: 有demo不?

支持(0) 反对(0) Timetombs | 园豆:3954 (老鸟四级) | 2020-08-04 13:49

@blackheart: 实际工作中的项目,没办法发给你,不过还是十分感谢!

支持(0) 反对(0) 若雪白衣 | 园豆:186 (初学一级) | 2020-08-06 09:17
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册