具有凭据的 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 仍未下载文件 的相关文章

  • Jenkins:在全局环境部分使用 withCredentials

    我有一个具有多个阶段的 Jenkins 管道 所有阶段都需要相同的环境变量 我像这样运行 script withCredentials usernamePassword credentialsId COMPOSER REPO MAGENTO
  • VB6下载网页源码

    VB6 有没有办法将网页源下载到字符串或文本框 例如 在 VB Net 中 WebClient 类允许您使用 DownloadString google com 执行此操作 我如何在 vb6 中执行相同操作 注意 我想避免使用网络浏览器 我
  • WebClient DownloadFileAsync() 阻塞线程

    我正在尝试使用 WPF 和 MVVM 从我的网络服务器下载一个大文件 500 mb 因此 以下属性都绑定到某种控件 进度条 问题是 即使使用 DownloadFileAsync 应用程序仍然挂起 文件is从我的日志中可以看出 正在下载 当然
  • 在 Web 应用程序中的何处存储数据库凭据?

    我想知道您使用什么技术来存储应用程序的数据库凭据 我特别关心 java webapps 但我认为没有必要将问题限制于此 需要考虑的事情 您是否使用属性文件 xml 配置文件或其他文件 它是捆绑到您的应用程序中 即在 jar 文件中 还是单独
  • Webservice.wsdl 和凭据

    所以我有一个问题正在努力解决 也许一些 Flex 专家可以提供帮助 我有一个 WebService 实例 它尝试从 JBoss 应用程序服务器加载 WSDL 文件 如果我做这样的事情 webService new WebService we
  • WebClient.DownloadString 速度慢?

    我正在开发一个使用 ASP Net 3 5 运行的 Web 应用程序 在应用程序的某个地方 我正在调用外部系统 此调用包括从特定 url 下载字符串 string targetUrl BuildMyUrl WebClient wc new
  • WebClient().DownloadString() 返回旧数据[重复]

    这个问题在这里已经有答案了 我正在使用此代码从 URL 获取返回字符串 webClient Encoding Encoding UTF8 response webClient DownloadString http somesite com
  • 是否应该在 using 语句中使用 WebClient?

    如果 HttpClient 不应该用于using声明 请参阅以下链接 https aspnetmonsters com 2016 08 2016 08 27 httpclientwrong https aspnetmonsters com
  • WebClient 下载字符串与 WebBrowser 查看源代码不同

    我正在创建一个 C 4 0 应用程序来使用 Web 客户端下载网页内容 网络客户端功能 public static string GetDocText string url string html string Empty try usin
  • VB.NET 中的 UploadString(Post 方法)不起作用

    我正在尝试将简单数据发布到某个站点 在本例中发布到本地服务器上的 php 文件 我的 VB NET 代码 Dim W As New Net WebClient Dim A As String W Encoding System Text E
  • 提供身份验证时,代理会缓存 HTTP 响应吗?

    给定一个 URI 其中包含正确配置的缓存标头 如果两个用户向同一 URI 发出请求 但提供两组不同的凭据 则代理是否会缓存每个用户 URI 或每个 URI 的响应 还是根本不缓存 该响应将仅用于其他用户 如果Cache Control响应头
  • Silverlight 中使用安全关键构造函数子类化透明类型的安全规则

    在Silverlight v4 0 安全模型中 肖恩 法卡斯 说 http blogs msdn com b shawnfa archive 2007 05 11 silverlight security iii inheritance a
  • 通过 Slack API 发送命令

    有没有办法以编程方式发送command通过 API 到 Slack 我已成功发布消息 var postingResponse client UploadValues https slack com api chat postMessage
  • 在 C#4 中向 ProgressChanged 事件添加额外参数

    这是我的代码 简单下载器 public void DownloadFile string urlAddress string location using webClient new WebClient webClient Download
  • 存储外部站点(不使用 OAuth)的用户凭据的智能方法是什么?

    我意识到 一般来说 您不应该直接存储用户凭据 即以纯文本形式 相反 最好存储它们的某种加密形式 但是 假设我创建了一个与其他第三方网站交互的网站 假设这个第 3 方站点提供了一个 API 需要用户的凭据 使用该站点 进行身份验证 如果我的目
  • 使用 .NET WebClient 模拟 XmlHttpRequest

    据我所知XmlHttpRequest我只需使用以下命令即可下载和上传数据send方法 但WebClient有很多方法 我不想要一个的所有功能WebClient 我只想创建一个模拟的对象XmlHttpRequest 但它没有 XSS 限制 我
  • docker登录 - 存储凭据时出错 - 写入权限错误

    我正在运行一个docker login命令作为 Bamboo 构建作业的一部分 命令文本通过以下方式获得aws ecr get login调用并在子 shell 中执行 该命令失败并显示Error saving credentials er
  • SVN 不会缓存凭据

    我正在使用命令行 svn 客户端 版本 1 6 12 来自 Ubuntu 存储库 但我似乎无法让它缓存我的用户凭据 我正在尝试访问 https svn 存储库 类似于https subversion FAKE com PROJECT htt
  • Powershell - 从图像网址下载图像

    对 powershell 的了解有限 我尝试从图像网址下载图像 例如这样 http hdwallpaperia com wp content uploads 2014 01 Mc Laren P1 Wallpaper Image Pictu
  • 影响浏览器是否提示保存凭据

    对于大多数具有用户名和密码对话框的网页 浏览器将提示用户是否要保存该表单的凭据 然而 对于此登录页面 http vdn volvoce com 事实并非如此 我找不到关于 IE 如何决定是否显示此对话框的任何好的数据 如何让 IE 显示该提

随机推荐