JoeYellowMing 发表于 2024-11-13 20:06

关于 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 的情况下)。这样的情况究竟是什么原因造成的?

啊笨 发表于 2024-11-13 20:49

C#不懂,但前端里面也有过这种问题,是不是有个叫 跨域 的东西。

本人新手,准备学前端。

zgcwkj 发表于 2024-11-13 20:51

重定向信息在响应头那里,你取一下30x的状态码,然后看一下响应头数据,就能知道重定向到什么位置了

JoeYellowMing 发表于 2024-11-13 21:02

啊笨 发表于 2024-11-13 20:49
C#不懂,但前端里面也有过这种问题,是不是有个叫 跨域 的东西。

本人新手,准备学前端。

这个很有可能,只是我更迷惑了,想不到该怎么办了{:1_909:}

JoeYellowMing 发表于 2024-11-13 21:13

本帖最后由 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

starktian 发表于 2024-11-13 21:13

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来判断状态,然后进行处理。

JoeYellowMing 发表于 2024-11-13 21:22

starktian 发表于 2024-11-13 21:13
using System;
using System.Net;
using System.Net.Http;


抱歉我描述有误,我重新查了一下发现网页抓的和 C# 获取的状态不一样。代码在本该第一次重定向就200了,根本没法继续执行,在上面我截了request的图,同时IsSuccessStatusCode=True

starktian 发表于 2024-11-13 21:37

我之前抓取页面遇到过内页是通过Javascript跳转的其他页面的,抓取时返回200,但是没有执行页面里的javascript代码就不会跳转。

JoeYellowMing 发表于 2024-11-13 21:56

starktian 发表于 2024-11-13 21:37
我之前抓取页面遇到过内页是通过Javascript跳转的其他页面的,抓取时返回200,但是没有执行页面里的javascr ...

https://s21.ax1x.com/2024/11/13/pAg1gIJ.png
我这个与您的情况好像不太一样?

starktian 发表于 2024-11-13 22:00

JoeYellowMing 发表于 2024-11-13 21:56
我这个与您的情况好像不太一样?

检测到302,然后获取Location再次请求呢?
页: [1] 2 3
查看完整版本: 关于 C# HttpClient 的疑惑