我正在尝试使用用户名/密码从网站下载文件。您需要支付注册帐户的费用才能下载文件 - 我们已经这样做了。我尝试传入用户名/密码并下载文件,如下所示:
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 字节。
我还需要做其他事情,这样它就不会重定向,并且在我通过身份验证后会将我带到资源吗?