WebClientクラスを使用すると、Webサイトのタイトルを簡単に取得できます。
WebClient x = new WebClient();
string source = x.DownloadString(s);
string title = Regex.Match(source,
@"\<title\b[^>]*\>\s*(?<Title>[\s\S]*?)\</title\>",
RegexOptions.IgnoreCase).Groups["Title"].Value;
URLとページタイトルを保存したい。ただし、次のようなリンクをたどる場合:
リダイレクト先のURLを取得したいのは明らかです。
[〜#〜] questions [〜#〜]
WebClient
クラスを使用してこれを行う方法はありますか?
HttpResponse
とHttpRequest
を使用してどうすればよいですか?
私が質問を理解していれば、人々が言っているよりもはるかに簡単です-WebClientにリクエストのすべての要点(リダイレクトを含む)をさせたいが、実際のレスポンスURIを取得したい場合最後に、次のようにWebClientをサブクラス化できます。
class MyWebClient : WebClient
{
Uri _responseUri;
public Uri ResponseUri
{
get { return _responseUri; }
}
protected override WebResponse GetWebResponse(WebRequest request)
{
WebResponse response = base.GetWebResponse(request);
_responseUri = response.ResponseUri;
return response;
}
}
WebClientを使用するすべての場所でMyWebClientを使用するだけです。必要なWebClient呼び出しを行ったら、ResponseUriを使用して、実際のリダイレクトされたURIを取得できます。 非同期のものを使用している場合、GetWebResponse(WebRequest request、IAsyncResult result)にも同様のオーバーライドを追加する必要があります。
私はこれがすでに答えられた質問であることを知っていますが、これは私にはかなりうまくいきます:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://tinyurl.com/dbysxp");
request.AllowAutoRedirect = false;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
string redirUrl = response.Headers["Location"];
response.Close();
//Show the redirected url
MessageBox.Show("You're being redirected to: "+redirUrl);
乾杯。! ;)
HttpWebRequest
を使用すると、 AllowAutoRedirect
property をfalse
に設定できます。この場合、ステータスコードが300〜399の応答は自動的にリダイレクトされません。
その後、応答ヘッダーから新しいURLを取得し、新しいHttpWebRequest
インスタンスを新しいURLに作成できます。
WebClient
class を使用すると、リダイレクトを許可しないようにすぐに変更できるとは思えません。できることは、WebClient
クラスからクラスを派生し、 GetWebRequest
および GetWebResponse
メソッドをオーバーライドして、 WebRequest
/ WebResponse
基本実装が返すインスタンス。 HttpWebRequest
の場合、AllowAutoRedirect
プロパティをfalse
に設定します。応答で、ステータスコードが300〜399の範囲にある場合は、新しい要求を発行します。
ただし、GetWebRequest
/GetWebResponse
メソッド内から新しいリクエストを発行できることはわかりません。そのため、HttpWebRequest
/-で実行するループを作成する方がよい場合があります。 HttpWebResponse
すべてのリダイレクトに従うまで。
リダイレクトされたページとページコンテンツのUriを取得しました。
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(strUrl);
request.AllowAutoRedirect = true;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream dataStream = response.GetResponseStream();
strLastRedirect = response.ResponseUri.ToString();
StreamReader reader = new StreamReader(dataStream);
string strResponse = reader.ReadToEnd();
response.Close();
リダイレクトURIのみに関心がある場合は、次のコードを使用できます。
_public static string GetRedirectUrl(string url)
{
HttpWebRequest request = (HttpWebRequest) HttpWebRequest.Create(url);
request.AllowAutoRedirect = false;
using (HttpWebResponse response = HttpWebResponse)request.GetResponse())
{
return response.Headers["Location"];
}
}
_
メソッドは戻ります
注意してください:using
ステートメント(または最後のresponse.close()
)は必須です。詳細については、 MSDNライブラリ を参照してください。そうしないと、このコードを複数回実行すると、接続が不足するか、タイムアウトが発生する可能性があります。
HttpWebRequest.AllowAutoRedirectはfalseに設定できます。次に、300の範囲のステータスコードを手動でhttpする必要があります。
// Create a new HttpWebRequest Object to the mentioned URL.
HttpWebRequest myHttpWebRequest=(HttpWebRequest)WebRequest.Create("http://www.contoso.com");
myHttpWebRequest.MaximumAutomaticRedirections=1;
myHttpWebRequest.AllowAutoRedirect=true;
HttpWebResponse myHttpWebResponse=(HttpWebResponse)myHttpWebRequest.GetResponse();