HTTP 302リダイレクトを返すURLがあり、リダイレクト先のURLを取得したいと思います。
問題は、System.Net.WebClientが実際にそれに従っているように見えることですが、これは悪いことです。 HttpWebRequestも同じように見えます。
単純なHTTPリクエストを作成し、WebClientがそれに従わずにターゲットの場所を取得する方法はありますか?
HTTPは十分に単純なので、rawソケット通信を実行したくなりますが、サイトはHTTPSを使用しており、ハンドシェイクは実行したくありません。
最後に、どのクラスを使用するかは気にしません。HTTP302リダイレクトに従わせたくないだけです:)
HttpWebRequest
では、AllowAutoRedirect
をfalse
に設定して、リダイレクトを自分で処理できます。
とても簡単です
MyRequestというHttpWebRequestを作成したとしましょう。
// don't allow redirects, they are allowed by default so we're going to override
myRequest.AllowAutoRedirect = false;
// send the request
HttpWebResponse response = myRequest.GetResponse();
// check the header for a Location value
if( response.Headers["Location"] == null )
{
// null means no redirect
}
else
{
// anything non null means we got a redirect
}
VSが目の前にないコンパイルエラーはすみませんが、過去にこれを使用してリダイレクトをチェックしました。
HttpWebRequest
にはプロパティ AllowAutoRedirect
があり、これをfalseに設定できます( WebClient
の場合は常にtrueです)、次に、 Location
HTTPヘッダーを取得します。
また、新しい場所が必要な場合は、HttpResponseMessage
にRequestMessage
プロパティがあります。 WebClient
は、一度設定するとAllowAutoRedirect
プロパティの変更をサポートしないため、便利な場合があります。