1

C#でHTTP応答から画像を取得しようとしていますが、画像の代わりに、それらのリダイレクトの1つです。関連するコードは次のとおりです。

String url = "my image URL that's actually a redirect URL"
Image img = null;
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
{
    using (Stream str = response.GetResponseStream())
    {
        img = Image.FromStream(str);
    }
}

しかし、それは私が応答を通して求めることができないと私に言い続けます。応答ストリームをbyte[]に保存してから印刷したところ、応答ストリームは実際には画像自体ではなくリダイレ​​クトページのものであり、ブラウザーはJavascriptを介してそれを処理していることがわかりました。

最初のリクエストへの応答として実際に送信されなかった場合、この画像をキャプチャするにはどうすればよいですか?ブラウザの後続のリクエストを監視する方法がわかりません。また、リダイレクト先の画像URLにストリームをポイントしても、同じ問題が発生し、同じリダイレクトページのHTMLが出力されます。

編集:これは(画像の代わりに)読み込まれているJavascriptページです(標準的なものもありますが、これはページ上の唯一のスクリプトです):

<script>
var escapedHash = '';
var url = 'https://login.salesforce.com/?ec=302&startURL=%2Fcontent%2Fsession%3Furl%3Dhttps%253A%252F%252Fc.na9.content.force.com%252Fprofilephoto%252F005%252FF';
if (window.location.hash) {
   escapedHash = '%23' + window.location.hash.slice(1);
}
if (window.location.replace){ 
window.location.replace(url + escapedHash);
} else {;
window.location.href = url + escapedHash;
} 
</script>
4

3 に答える 3

2

一部のサイトでは、ホストされている画像を使用できないようにするための措置を講じています。基本的に、要求元のサイト(参照URL)がそのドメインにあると主張する必要があります。

ブラウザが使用したのと同じリンクを使用するとどうなりますか?画像を右クリックすると、「画像のURLをコピー」または「プロパティ」を表示できますか?その場合、URLを新しいブラウザウィンドウにコピーするとどうなりますか?ダウンロードしようとしているURLとして新しいブラウザウィンドウ(画像を表示)からのURLを使用するとどうなりますか?

私の経験では、リダイレクトはブラウザと.NETクラスによって問題なく処理されます。ただし、リダイレクトを自動的に追跡するように、引数を指定するか、プロパティを設定する必要がある場合があります。

ダウンロードしようとしているURLを取得することは可能ですか?

更新
デスクトップアプリはどこにログインしますか?ログインしていないため、このサイトでは画像に直接アクセスできません。これは、アプリケーションでも問題になります。

アプリがログインしていないため、ログインページへのリダイレクトが表示されます。

于 2012-05-16T17:49:54.447 に答える
1

問題の根本は私が愚かであるということでした。コードは完全に正常に機能します。デバッグのために以前にOpenAuth認証機能をコメントアウトしたことを忘れました。

そのため、問題は、これらの画像リクエストがすべてOAuthヘッダーなしで送信されていたため、サーバーが画像の代わりに「ログイン」ページを返すことでした(明らかにC#画像に読み込むことができませんでした)。

話の教訓:送信するすべてのリクエストを認証するようにしてください。

于 2012-05-16T19:09:53.273 に答える
0

最初のリクエストでリダイレクトに従う必要があります(HTTPステータス301とレスポンスのヘッダーTransportで識別されます)。その後、リダイレクト場所からの応答に現在のアプローチを使用できます。

于 2012-05-16T17:46:09.797 に答える