首页 > 解决方案 > 在 c# 中保存/加载 HttpClient 的“浏览器”会话

问题描述

我有一个 Webcrawler 应用程序,它使用 HttpClient 来执行一些请求。

当我启动应用程序时,会初始化一个新的 HttpClient,如下所示:

public static void ResetHttpClient()
{
    Client = new HttpClient();
}

应用程序重新启动后,应用程序必须重新登录,这会由于每小时 n 次登录的限制而导致麻烦。

因此,我从我的应用程序的另一部分复制了一个函数,该函数序列化列表>并将此列表保存到文件中。

我调整了该函数以便使用 HttpClient 对其进行测试。我的意图是保存 HttpClient,然后在程序启动/重新启动时,加载 HttpClient 并继续“会话”。Save 函数的代码(我知道 List 非常难看):

// SAVE
(HttpClient client, DateTime clientCreationDate) httpClientSaveData = 
    new ValueTuple<HttpClient, DateTime>(Client, ClientCreatedDate);
FileStream stream = new FileStream(@"HttpClient.dat", FileMode.Create);
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, httpClientSaveData);
stream.Close();

使用上面的代码,我收到以下错误消息:

System.Runtime.Serialization.SerializationException:'在程序集'System.Net.Http,版本=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a'中键入'System.Net.Http.HttpClient'未标记为可序列化。'

现在我的问题是:是否甚至可以保存/加载“会话”,例如通过保存 cookie?有什么可行的方法来解决这个问题?

标签: c#sessionhttpclient

解决方案


发生错误是因为您尝试序列化没有该[Serializable]属性的对象。因为它是一个框架类,所以你也不能添加它。

HttpClient对象旨在被重用,这只是您的应用程序中如何重用的问题。通常,您会将框架包装在HttpClient执行所需特定操作的类中,并将其用作 Singleton。

看起来这或多或少是您正在做的事情,所以问题更多是您的应用程序频繁启动和停止,这导致对象被重新创建。

如果您想在保持状态的同时定期运行某些东西,那么完成这项工作的最佳工具是Windows 服务

如果您基于在您自己的 Web 应用程序中接收到另一个请求来触发您的请求,那么您应该考虑使用具有单例范围的依赖注入。只要启用了应用程序池,这将使对象保持活动状态。如有必要,您可以增加 IIS 中的空闲时间。我认为默认情况下是 15 分钟,这将保证每小时不超过 4 次登录。

编辑:

由于主要问题似乎是在开发和测试期间,您应该能够作弊。使用像 Fiddler 这样的代理,您可以记录手动登录所采取的步骤。您需要注意的是 Http Headers。大多数身份验证/会话类型数据将位于Cookie标头或Authorization标头中。也可能有类似X-Session-ID或类似的标题。您应该能够在成功登录后手动复制标头,然后将它们粘贴到您的代码中。像 Postman 这样的客户端在这里非常有用,可以准确地确定需要哪些标头。

您的代码可能如下所示:

public static void ResetHttpClient()
{
    Client = new HttpClient();

    if (isDevelopment) // however you determine it
    {
         Client.DefaultRequestHeaders
               .TryAddWithoutValidation("Authorization", "Bearer hhxcshRT43bhJHjh53hkjhbhvghf54g5hbhkghfdUGUKGYFDJihu5");
         Client.DefaultRequestHeaders
               .TryAddWithoutValidation("Cookie", "SessionID=36dab-3545-adef");
    }
}

推荐阅读