我正在尝试使用用户名/密码从网站下载文件。您需要支付注册帐户才能下载文件 - 我们已经完成了。我试图传递用户名/密码并下载文件如下:
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个字节。
还有其他我需要做的事情,所以它不会重定向,一旦我通过身份验证就会把我带到资源中吗?
答案 0 :(得分:0)
(在问题编辑中回答。转换为社区维基回答。请参阅Question with no answers, but issue solved in the comments (or extended in chat))
OP写道:解决。所以问题出在我的耳朵之间。我将安全资源的URL传递给.UploadValues()方法,因为它知道它将重定向到登录页面。但是,我真的需要从登录表单(提交的地方)传入URL - 而不是登录页面本身。一旦我这样做,它就能正常工作。我想我现在就去找食品服务部门了。
<强>链接强>
已经在SO上发布了一些解决此问题的问题。我一开始并不知道自己在寻找什么,所以我没有看到那些......这里的任何地方都是我在处理这个问题时遇到的一些好资源: