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

时间:2012-11-19 15:58:57

标签: webclient credentials webclient-download

我正在尝试使用用户名/密码从网站下载文件。您需要支付注册帐户才能下载文件 - 我们已经完成了。我试图传递用户名/密码并下载文件如下:

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。我已经验证我正在使用看似有效的32字节JSESSIONID值的cookie返回。

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

还有其他我需要做的事情,所以它不会重定向,一旦我通过身份验证就会把我带到资源中吗?

1 个答案:

答案 0 :(得分:0)

(在问题编辑中回答。转换为社区维基回答。请参阅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