【问题标题】:WebClient with credentials still not downloading file具有凭据的 WebClient 仍未下载文件
【发布时间】:2012-11-07 14:13:12
【问题描述】:

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

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 抓取网站。

还有什么我应该在这里做的吗?

更新

好的,我做了一些调查,发现了一些关于这个问题的有用信息。我还没有让它工作,但我想我更接近了。首先,您需要创建一个扩展 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 个字节。

还有什么我需要做的,这样它就不会重定向,并且一旦我通过身份验证就会把我带到资源?

【问题讨论】:

  • 网站是否使用HTTP认证?
  • 是的,它使用 SSL。谢谢你提出来。我应该提到它。
  • SSL 与 HTTP 身份验证无关。
  • 大声笑。我相信它正在使用表单身份验证。它需要 cookie。
  • 改用餐饮服务?您仍然需要处理 cookie...

标签: webclient credentials webclient-download


【解决方案1】:

(在问题编辑中回答。转换为社区 wiki 答案。见Question with no answers, but issue solved in the comments (or extended in chat)

OP 写道:

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

链接

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

how to maintaine cookies in between two Url's in asp.net

Trying to get authentication cookie(s) using HttpWebRequest

【讨论】:

    猜你喜欢
    • 2015-12-30
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-28
    • 1970-01-01
    相关资源
    最近更新 更多