关于 C# HttpClient 的疑惑
_logger.LogInformation("Checking QR code status...");
do
{
await Task.Delay(800);
timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
var statusResponse = await client.GetStringAsync($"{BaseUrl}/qrCode/getStatus.htl?ts={timestamp}&uuid={uuid}");
if (!int.TryParse(statusResponse, out statusCode))
{
_logger.LogError("Failed to parse status code. As the Response is {statusResponse}", statusResponse);
}
switch (statusCode)
{
case 3:
_logger.LogWarning("QR code expired.");
break;
case 2:
_logger.LogInformation("QR code scanned.");
break;
}
} while (statusCode != 1);
_logger.LogInformation("QR code login successful.");
await PostLoginAsync(uuid, executionValue);
Cookie ticketCookie = CookieContainer.GetAllCookies()
.FirstOrDefault(c => c.Name == "MOD_AUTH_CAS")
?? throw new Exception("Failed to get ticket cookie.");
string ticket = ticketCookie.Value
.AsSpan(9).ToString();
await client.GetAsync($"{PortalUrl}/index.do?ticket={ticket}");
_ = cookieContainer.GetAllCookies().First(c => c.Name == "_WEU");
return true;
全文在[这里](https://github.com/ProjektMing/qrLogin-BISTU/blob/master/BistuAuthenticator.cs),设计得不太好,有啥问题请指出来
我设计了上方代码以实现校园网 cookie 的获取,但实际上该代码在登录成功后会经历两次重定向,而我在写的时候发现始终无法获得重定向的信息,httpclient 也不能获取到我所需的cookie(即使在默认 redirect=true 的情况下)。这样的情况究竟是什么原因造成的? C#不懂,但前端里面也有过这种问题,是不是有个叫 跨域 的东西。
本人新手,准备学前端。 重定向信息在响应头那里,你取一下30x的状态码,然后看一下响应头数据,就能知道重定向到什么位置了 啊笨 发表于 2024-11-13 20:49
C#不懂,但前端里面也有过这种问题,是不是有个叫 跨域 的东西。
本人新手,准备学前端。
这个很有可能,只是我更迷惑了,想不到该怎么办了{:1_909:} 本帖最后由 JoeYellowMing 于 2024-11-13 21:14 编辑
zgcwkj 发表于 2024-11-13 20:51
重定向信息在响应头那里,你取一下30x的状态码,然后看一下响应头数据,就能知道重定向到什么位置了
哦抱歉给了您错误的信息,我这里post的信息返回了200,响应头里没看到东西(我对 web 不熟,描述上可能不太对)总之拿到的实际是下图这个
https://s21.ax1x.com/2024/11/13/pAgQuee.png using System;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
class Program
{
private static readonly HttpClient client = new HttpClient();
static async Task Main(string[] args)
{
// 设置初始请求的URL
string url = "https://example.com";
// 调用方法请求页面
await FetchPageAsync(url);
}
static async Task FetchPageAsync(string url)
{
// 发起初始请求
var response = await client.GetAsync(url);
// 检查响应状态码
if (response.StatusCode == HttpStatusCode.NotModified)
{
Console.WriteLine("页面未更改 (304),需要重定向或重新请求。");
// 根据具体业务逻辑执行后续处理,比如重新请求不同的URL
// 这里可以定义是否重定向到另一个地址,或进行其他处理
}
else if (response.StatusCode == HttpStatusCode.Redirect ||
response.StatusCode == HttpStatusCode.MovedPermanently)
{
// 处理重定向,获取新地址并重新请求
var redirectUrl = response.Headers.Location?.ToString();
if (!string.IsNullOrEmpty(redirectUrl))
{
Console.WriteLine($"重定向到新地址: {redirectUrl}");
await FetchPageAsync(redirectUrl);// 递归调用重新请求新地址
}
}
else if (response.IsSuccessStatusCode)
{
// 处理成功的响应
var content = await response.Content.ReadAsStringAsync();
Console.WriteLine("页面内容:" + content);
}
else
{
Console.WriteLine($"请求失败,状态码: {response.StatusCode}");
}
}
}
使用response.StatusCode来判断状态,然后进行处理。 starktian 发表于 2024-11-13 21:13
using System;
using System.Net;
using System.Net.Http;
抱歉我描述有误,我重新查了一下发现网页抓的和 C# 获取的状态不一样。代码在本该第一次重定向就200了,根本没法继续执行,在上面我截了request的图,同时IsSuccessStatusCode=True 我之前抓取页面遇到过内页是通过Javascript跳转的其他页面的,抓取时返回200,但是没有执行页面里的javascript代码就不会跳转。 starktian 发表于 2024-11-13 21:37
我之前抓取页面遇到过内页是通过Javascript跳转的其他页面的,抓取时返回200,但是没有执行页面里的javascr ...
https://s21.ax1x.com/2024/11/13/pAg1gIJ.png
我这个与您的情况好像不太一样? JoeYellowMing 发表于 2024-11-13 21:56
我这个与您的情况好像不太一样?
检测到302,然后获取Location再次请求呢?