【发布时间】: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