ユーザー名/パスワードを使用して Web サイトからファイルをダウンロードしようとしています。ファイルをダウンロードするには、登録済みアカウントの料金を支払う必要があります。ユーザー名/パスワードを渡して、次のようにファイルをダウンロードしようとしています:
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 で Web サイトをスクレイピングします。
私がここでやるべきことは他にありますか?
アップデート
さて、私はいくつかのスニッフィングを行い、この問題に関するいくつかの有用な情報を見つけました. 私はまだそれを機能させていませんが、私は近づいていると思います。まず、次のように、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() メソッドを使用して、ログイン情報をターゲット Web サイトにアップロードします。ターゲット リソースの認証とダウンロードの完全なプロセスは次のとおりです。
using (var webClient = new CookiesAwareWebClient())
{
var postData = new NameValueCollection()
{
{ "userId", username },
{ "password", password }
};
webClient.UploadValues(docUrl, postData);
fileData = webClient.DownloadData(docUrl);
}
フォーム認証を使用しているサイトについて間違っていました。これは JSP Web サイトであり、JSESSIONID を使用します。有効な 32 バイトの JSESSIONID 値と思われる Cookie が返されることを確認しました。
ただし、 WebClient.DownloadData() を呼び出すと、リダイレクトされたログイン ページのみが返されます。HttpWebRequest の AllowAutoRedirect プロパティを false に設定してこれを修正しようとしましたが、0 バイトが返されます。
リダイレクトされず、認証後にリソースに移動するようにするには、他に何かする必要がありますか?