HttpClient请求图片返回302且Location为空,为何浏览器可正常加载?
问题1:浏览器为何可以正常加载该图片?
- 该站点配置了防盗链规则,仅允许携带符合要求的
Referer、User-Agent请求头的访问获取图片资源 - 浏览器请求网页内嵌入的图片时,会自动补全这两个请求头,符合站点校验规则,因此可以直接拿到200响应和图片内容
- 站点对不符合校验规则的请求会返回无Location字段的302响应,故意拦截非浏览器的非法请求
问题2:你的代码存在什么问题?
你的代码缺少符合浏览器规则的请求头配置,触发了站点的拦截逻辑:
- 没有设置
User-Agent请求头,默认HttpClient的UA标识会被站点识别为非浏览器请求 - 没有配置合法的
Referer请求头,触发了站点的防盗链校验 - 就算开启了HttpClient的自动重定向配置,因为302响应没有Location字段,也无法完成自动跳转获取资源
修复代码示例
using (var handler = new HttpClientHandler()) { // 可根据需求选择是否关闭自动重定向 handler.AllowAutoRedirect = false; using (var client = new HttpClient(handler)) { // 模拟浏览器的User-Agent client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"); // 配置对应站点的Referer,和图片所属站点域名保持一致 client.DefaultRequestHeaders.Referrer = new Uri("https://www.paymentscardsandmobile.com/"); using (var request = new HttpRequestMessage(HttpMethod.Get, fileUrl)) { var response = await client.SendAsync(request); // 校验响应状态码正常后再读取流 if (response.IsSuccessStatusCode) { var stream = await response.Content.ReadAsStreamAsync(); } } } }
内容的提问来源于stack exchange,提问作者Test
相关产品推荐
相关产品推荐

