具有凭据的 WebClient 仍未下载文件

2024-03-01

我正在尝试使用用户名/密码从网站下载文件。您需要支付注册帐户的费用才能下载文件 - 我们已经这样做了。我尝试传入用户名/密码并下载文件,如下所示:

if (docUrl != null)
            {
                if (!string.IsNullOrEmpty(username) && !string.IsNullOrEmpty(password))
                    this.WebClientInstance.Credentials = new NetworkCredential(username, password);

                fileData = this.WebClientInstance.DownloadData(docUrl);
                this.WebClientInstance.Dispose();
                isDataDownloaded = true;
            }

WebClientInstance 是一个System.Net.WebClient。我调试并验证它正在上线以设置凭据。我最终没有下载 PDF,而是得到了一个 HTML 页面,提示我登录以访问该文件。我已验证用户名/密码正确。我使用相同的凭据通过 WatiN 抓取网站。

我还应该在这里做其他事情吗?

UPDATE

好的,我已经做了一些嗅探,发现了一些关于这个问题的有用信息。我还没有让它发挥作用,但我想我已经更接近了。首先,您需要创建一个扩展 WebClient 类的 cookie 感知 WebClient,如下所示:

public class CookiesAwareWebClient : WebClient
{
    public CookieContainer CookieContainer { get; private set; }

    public CookiesAwareWebClient()
    {
        this.CookieContainer = new CookieContainer();
    }

    protected override WebRequest GetWebRequest(Uri address)
    {
        var webRequest = base.GetWebRequest(address);

        if (webRequest is HttpWebRequest)
            (webRequest as HttpWebRequest).CookieContainer = this.CookieContainer;

        return webRequest;
    }
}

接下来是使用 WebClient.UploadValues() 方法将登录信息上传到目标网站。目标资源认证和下载的完整流程如下:

using (var webClient = new CookiesAwareWebClient())
                    {
                        var postData = new NameValueCollection()
                        {
                            { "userId", username },
                            { "password", password }
                        };

                        webClient.UploadValues(docUrl, postData);

                        fileData = webClient.DownloadData(docUrl);
                    }

我对使用表单身份验证的网站的看法是错误的。它是一个 JSP 网站并使用 JSESSIONID。我已验证我收到的 cookie 似乎是有效的 32 字节 JSESSIONID 值。

但是,当我调用 WebClient.DownloadData() 时,它仍然只返回重定向的登录页面。我尝试通过将 HttpWebRequest 上的AllowAutoRedirect 属性设置为 false 来解决此问题,但随后它返回 0 字节。

我还需要做其他事情,这样它就不会重定向,并且在我通过身份验证后会将我带到资源吗?


(在问题编辑中回答。转换为社区维基答案。请参阅没有答案的问题,但问题已在评论中解决(或在聊天中扩展) https://meta.stackoverflow.com/questions/251597/question-with-no-answers-but-issue-solved-in-the-comments )

OP 写道:

解决了。所以问题出在我的耳朵之间。我将安全资源的 URL 传递给 .UploadValues() 方法,知道它将重定向到登录页面。然而,我确实需要从登录表单(提交时所在的位置)传递 URL,而不是登录页面本身。一旦我这样做了,它就正常工作了。我想我现在要去餐饮服务行业找一份工作。

LINKS

SO 上已经发布了一些解决此问题的问题。我一开始只是不知道我在寻找什么,所以我没有看到那些......这里有一些我在解决这个问题时遇到的好资源:

如何在asp.net中的两个Url之间维护cookie https://stackoverflow.com/questions/6502581/how-to-maintaine-cookies-in-between-two-urls-in-asp-net

尝试使用 HttpWebRequest 获取身份验证 cookie https://stackoverflow.com/questions/11762301/trying-to-get-authentication-cookies-using-httpwebrequest

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有凭据的 WebClient 仍未下载文件 的相关文章

  • WebClient DownloadString 不返回任何内容

    我想从海盗湾的搜索查询中获取源代码 我的代码中有这个 但它不返回任何内容 WebClient webpage new WebClient string source webpage DownloadString http thepirate
  • WebClient DownloadString UTF-8 不显示国际字符

    我尝试将网站的 html 保存在字符串中 该网站具有国际字符 即使我将编码设置为与网站字符集相对应的 UTF 8 它们也不会保存到字符串中 这是我的代码 using WebClient client new WebClient client
  • 如何设置 PHP_AUTH_USER

    PHP AUTH USER 为空 并且系统使用Windows登录凭据 我该如何改变它 我想使用用户输入的用户名和密码 See 使用 PHP 进行 HTTP 身份验证 http php net manual en features http
  • C# WebClient 非英文请求标头值编码

    我想将一些自定义标头添加到网络请求的标头中 我通过 WebClient Headers Add Header Value 方法来执行此操作 ASCII 字符没有问题 但非 ASCII 字符有问题 是否可以改变 标头编码值 None
  • 使用数据库表作为 JMeter 的 CSV 数据集

    我目前正在使用 JMeter 对我公司的一个应用程序进行性能测试 该应用程序需要登录 我必须使用多个用户 在 JMeter 中通常完成此操作的方式似乎是通过 CSV 数据集 但是我可以访问数据库并可以直接从那里读取所有凭据 由于这是一个测试
  • 从 TortoiseGit 中删除保存的凭据

    我的凭据保存在 TortoiseGit 中 使用 Wincred 但我的密码已更改 我现在从存储库中提取的唯一方法是删除凭据助手 如何简单地更改密码 或者 我可以删除我的凭据并保存新的凭据吗 通常 无效凭据应自动清除 在一次身份验证尝试失败
  • Spring Boot中使用webclient调用graphqlmutation API

    我在 Spring Boot 中调用 graphQL 突变 API 时陷入困境 让我解释一下我的场景 我有两个微服务 一个是 AuditConsumeService 它使用来自 activeMQ 的消息 另一个是 GraphQL 层 它只是
  • VB6下载网页源码

    VB6 有没有办法将网页源下载到字符串或文本框 例如 在 VB Net 中 WebClient 类允许您使用 DownloadString google com 执行此操作 我如何在 vb6 中执行相同操作 注意 我想避免使用网络浏览器 我
  • 使用 WebClient 和 WebRequest 之间的编码差异?

    在获取一些随机的西班牙报纸索引时 我没有使用 WebRequest 正确获取变音符号 它们产生了这个奇怪的字符 同时使用 a 从同一个 uri 下载响应WebClient我得到了适当的回应 为什么会出现这种差异化呢 var client n
  • WebClient DownloadFileAsync() 阻塞线程

    我正在尝试使用 WPF 和 MVVM 从我的网络服务器下载一个大文件 500 mb 因此 以下属性都绑定到某种控件 进度条 问题是 即使使用 DownloadFileAsync 应用程序仍然挂起 文件is从我的日志中可以看出 正在下载 当然
  • Android android.credentials.UNLOCK 初始化无密码密钥库

    有一个随机密钥通过 AES 加密本地凭据 我按照下面的教程尝试存储securely该密钥稍后可以解密 nelenkov blogspot co uk 在 Android 中存储应用程序秘密 http nelenkov blogspot jp
  • 从 C# 中的 WebClient 读取响应标头

    我正在尝试创建我的第一个 Windows 客户端 这是我第一次发布她的文章 它将与 Web 服务 进行通信 但是我在读取返回的响应标头时遇到了一些麻烦 在我的响应字符串中 我收到了一个不错的 JSON 文档 这是我的下一个问题 但我无法 查
  • WebClient.DownloadFileTaskAsync() 实际上永远不会超时吗?

    在异步之前的日子里 人们想知道如何设置超时WebClient答案很简单 就是扩展基类并覆盖GetWebRequest 并在那里设置超时 protected override WebRequest GetWebRequest Uri addr
  • 在 WebClient wp7 中重定向时获取当前 Uri

    我希望我不会开始一个已经完成的话题 但我在这里或其他地方都没有找到任何正确的答案 那么我们开始吧 我使用 WebClient 从网页下载 HTML 代码 然后使用该 WebClient 发送新请求 并且网页会重定向我 现在我想知道网站把我放
  • 连接尝试失败,因为连接方在一段时间后没有正确响应或连接的主机无法响应

    我正在开发一个 Windows 服务 它从特定的 URL 下载图像 该服务在我的计算机上正常运行 但是当我将其安装在服务器中时 它不会下载图像 并且出现以下错误 System Net WebException Unable to conne
  • 如何使用 C# 在 Windows 上存储和检索凭据

    我构建了一个要在 Windows 10 上运行的 C 程序 我想只需按一个按钮即可从该程序发送电子邮件 计算结果 我把from 电子邮件地址和subject 等 但我不想在程序中的任何地方放置明文密码 并且我不希望用户每次发送邮件时都必须输
  • 多线程代理检查器

    我有很少的代码 例如 using WebClient wc new WebClient wc Proxy new WebProxy IP Port resume if wc IsBusy string rtn msg string Empt
  • Google Drive/OAuth - 无法弄清楚如何获得可重复使用的 GoogleCredentials

    我已经成功安装并运行名为 DriveCommandLine 的 Google Drive 快速启动应用程序 https developers google com drive quickstart 我还对其进行了一些调整 以获取我的云端硬盘
  • 使用自己的 Web 应用程序 API - 使用 OAuth2 进行身份验证过程

    Overview 我目前正在为图像共享应用程序创建 API 该应用程序将在网络上运行 将来在移动设备上运行 我了解 API 构建的逻辑部分 但我仍然在努力满足我自己对身份验证部分的要求 因此 我的 API 必须可供全世界访问 具有访客访问权
  • 无法解析远程名称 - webclient

    我面临这个错误 The remote name could not be resolved russgates85 001 site1 smarterasp net 当我请求使用 Web 客户端读取 html 内容时 出现错误 下面是我的代

随机推荐