web-dev-qa-db-ja.com

C#でWebClientを使用して、リダイレクト後にサイトのURLを取得する方法はありますか?

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とページタイトルを保存したい。ただし、次のようなリンクをたどる場合:

http://tinyurl.com/dbysxp

リダイレクト先のURLを取得したいのは明らかです。

[〜#〜] questions [〜#〜]

WebClientクラスを使用してこれを行う方法はありますか?

HttpResponseHttpRequestを使用してどうすればよいですか?

41

私が質問を理解していれば、人々が言っ​​ているよりもはるかに簡単です-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)にも同様のオーバーライドを追加する必要があります。

66
Will Dean

私はこれがすでに答えられた質問であることを知っていますが、これは私にはかなりうまくいきます:

 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);

乾杯。! ;)

16
WhySoSerious

HttpWebRequest を使用すると、 AllowAutoRedirect propertyfalseに設定できます。この場合、ステータスコードが300〜399の応答は自動的にリダイレクトされません。

その後、応答ヘッダーから新しいURLを取得し、新しいHttpWebRequestインスタンスを新しいURLに作成できます。

WebClient class を使用すると、リダイレクトを許可しないようにすぐに変更できるとは思えません。できることは、WebClientクラスからクラスを派生し、 GetWebRequest および GetWebResponse メソッドをオーバーライドして、 WebRequest / WebResponse 基本実装が返すインスタンス。 HttpWebRequestの場合、AllowAutoRedirectプロパティをfalseに設定します。応答で、ステータスコードが300〜399の範囲にある場合は、新しい要求を発行します。

ただし、GetWebRequest/GetWebResponseメソッド内から新しいリクエストを発行できることはわかりません。そのため、HttpWebRequest /-で実行するループを作成する方がよい場合があります。 HttpWebResponse すべてのリダイレクトに従うまで。

6
casperOne

リダイレクトされたページとページコンテンツの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();
3
Stephan Unrau

リダイレクト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"];
     }
}
_

メソッドは戻ります

  • null-リダイレクトがない場合
  • 相対URL-リダイレクトの場合

注意してくださいusingステートメント(または最後のresponse.close())は必須です。詳細については、 MSDNライブラリ を参照してください。そうしないと、このコードを複数回実行すると、接続が不足するか、タイムアウトが発生する可能性があります。

2
JimiLoe

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();  
0
Arnshea