我怀疑您尝试访问的网页使用了表单身份验证。这意味着如果您希望能够访问受保护的资源,则必须提供有效的身份验证 cookie。为了获得有效的身份验证 cookie,您必须首先通过向发出 cookie 的登录页面发送 POST 请求来验证自己。检索 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 很糟糕,您可能需要在登录请求中发送一些其他参数。您可以执行以下操作:在 Web 浏览器中进行身份验证,并使用 FireBug 查看需要发送的确切参数和标头。