認証されていないクライアント(WebClient.DownloadString
)がページを要求している場合、通常、認証可能なログインフォームにリダイレクトされます。クレデンシャルが渡されて確認されると、クライアントは通常、最初に要求したページに戻ります。
これに合格するには、認証をシミュレートする必要があります。これには通常、ユーザー名とパスワードの受け渡し、Cookieの受け入れ、およびCookieを使用して以降の要求が含まれます。非常に基本的なレベルでは、これはアプローチを説明する必要があります。
using System.Text;
using System.Net;
using System.IO;
using System.Diagnostics;
namespace HttpsRequest
{
public static class Program
{
public static void Main(string[] args)
{
var cookieContainer = new CookieContainer();
var loginRequest = WebRequest.CreateHttp("https://your.url.net/login");
loginRequest.CookieContainer = cookieContainer;
var response = loginRequest.Post("Login=foo&Password=bar");
Debug.Assert(response.StatusCode == HttpStatusCode.OK || response.StatusCode == HttpStatusCode.NoContent);
var homeRequest = WebRequest.CreateHttp("https://your.url.net/home");
homeRequest.CookieContainer = cookieContainer;
Debug.Assert(response.StatusCode == HttpStatusCode.OK);
homeRequest.GetResponse().Body();
}
internal static HttpWebResponse Post(this HttpWebRequest request, string data)
{
try
{
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
var encoding = new ASCIIEncoding();
var dataAsBytes = encoding.GetBytes(data);
request.ContentLength = dataAsBytes.Length;
var stream = request.GetRequestStream();
stream.Write(dataAsBytes, 0, dataAsBytes.Length);
stream.Close();
return (HttpWebResponse)request.GetResponse();
}
catch (WebException we)
{
return (HttpWebResponse)we.Response;
}
}
internal static string Body(this WebResponse response)
{
var stream = response.GetResponseStream();
using (var reader = new StreamReader(stream, Encoding.GetEncoding("utf-8")))
{
return reader.ReadToEnd();
}
}
}
}
これを機能させるには、Fiddler、FireBug、または同様のツールを使用してブラウザーからサイトに送信された実際のリクエストを確認し、可能な限りエミュレートしてみることをお勧めします。たとえば、サイトで追加または異なる投稿フィールド、HTTPヘッダーが必要な場合や、無効なSSL証明書がある場合があります。