我懷疑您試圖訪問的網頁使用表單身份驗證。這意味着如果您希望能夠訪問受保護的資源,則必須提供有效的身份驗證Cookie。爲了獲得一個有效的身份驗證cookie,您必須首先通過發送POST請求到發出cookie的LogOn頁面進行身份驗證。一旦您檢索到cookie,您就可以將其隨後發送給受保護資源。您還應該注意到,開箱即用的WebClient
不支持cookie。出於這個原因,你可以寫一個自定義的cookie識別Web客戶端:
public class CookieAwareWebClient : WebClient
{
public CookieAwareWebClient()
{
CookieContainer = new CookieContainer();
}
public CookieContainer CookieContainer { get; private set; }
protected override WebRequest GetWebRequest(Uri address)
{
var request = (HttpWebRequest)base.GetWebRequest(address);
request.CookieContainer = CookieContainer;
return request;
}
}
現在你可以使用這個客戶端仍然發射了2個請求:
using (var client = new CookieAwareWebClient())
{
var values = new NameValueCollection
{
{ "username", "john" },
{ "password", "secret" },
};
client.UploadValues("http://domain.loc/logon.aspx", values);
// If the previous call succeeded we now have a valid authentication cookie
// so we could download the protected page
string result = client.DownloadString("http://domain.loc/testpage.aspx");
}
顯然,由於ASP.NET的ViewState的crapiness您可能需要根據您的登錄請求發送一些其他參數。以下是您可以執行的操作:在Web瀏覽器中進行身份驗證,然後使用FireBug查看需要發送的確切參數和標頭。
你爲什麼不簡單地重定向到那個頁面?使用服務器進程中的代碼下載它意味着你*不使用相同的憑證。如果我理解正確,而不是瀏覽器(通過客戶端的憑證)訪問頁面,則不同計算機(服務器)上的另一個進程將下載並將其呈現給客戶端! – shambulator
這些憑證如何提供給網頁?它使用表單身份驗證嗎? –
@shambulator你是什麼意思重定向到該頁面?我正在嘗試獲取該頁面的html代碼。 – mko