9

System.Web を使用してサーバーからファイルをダウンロードしようとしています。実際には機能しますが、一部のリンクで問題が発生します。リンクは次のようになります。

http://cdn.somesite.com/r1KH3Z%2FaMY6kLQ9Y4nVxYtlfrcewvKO9HLTCUBjU8IBAYnA3vzE1LGrkqMrR9Nh3jTMVFZzC7mxMBeNK5uY3nx5K0MjUaegM3crVpFNGk6a6TW6NJ3hnlvFuaugE65SQ4yM5754BM%2BLagqYvwvLAhG3DKU9SGUI54UAq3dwMDU%2BMl9lUO18hJF3OtzKiQfrC/the_file.ext

コードは基本的に次のようになります。

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(link);
WebResponse response = request.getResponse();

getResponse() は常に例外をスローします (エラー 400 Bad Request)。ただし、Firefox で問題なくファイルをダウンロードできるため、リンクが機能することはわかっています。

また、Uri.UnescapeDataString(link) を使用してリンクをデコードしようとしましたが、そのリンクは Firefox でも機能しません。

他のリンクはこの方法で完全に機能します..これらだけでは機能しません.

編集:

さて、私はwiresharkを使って何かを見つけました:

Firefox を使用してリンクを開くと、次のメッセージが送信されます。

&ME3@"dM*PNyAo PA:]GET /r1KH3Z%2FaMY6kLQ9Y4nVxYp5DyNc49t5kJBybvjbcsJJZ0IUJBtBWCgri3zfTERQught6S8ws1a%2BCo0RS5w3KTmbL7i5yytRpn2QELEPUXZTGYWbAg5eyGO2yIIbmGOcFP41WdrFRFcfk4hAIyZ7rs4QgbudzcrJivrAaOTYkEnozqmdoSCCY8yb1i22YtEAV/epd_outpost_12adb.flv HTTP/1.1
Host: cdn.somesite.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/20100101 Firefox/12.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive

WebRequest.Create(link) が URL をデコードするため、最初の行だけが問題だと思います。

&MEz.@!dM/nP9@~P>.GET /r1KH3Z/aMY6kLQ9Y4nVxYp5DyNc49t5kJBybvjbcsJJZ0IUJBtBWCgri3zfTERQught6S8ws1a%2BCo0RS5w3KTmbL7i5yytRpn2QELEPUXZTGYWbAg5eyGO2yIIbmGOcFP41WdrFRFcfk4hAIyZ7rs6Mmh1EsQQ4vJVYUwtbLBDNx9AwCHlWDfzfSWIHzaaIo/epd_outpost_12adb.flv HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/20100101 Firefox/12.0
Host: cdn.somesite.com

( %2F は / に置き換えられます)

別の編集:

Uri クラスが URL を自動的にデコードすることがわかりました。 Uri uri = new Uri(link); //リンクはデコードされません Debug.WriteLine(uri.ToString()); // リンクはここでデコードされます。

どうすればこれを防ぐことができますか?

よろしくお願いします。

4

2 に答える 2

20

デフォルトでは、UriクラスはURIでエスケープ/文字( )を許可しません(これはRFC 3986%2fの私の読みでは合法であるように見えますが)。

Uri uri = new Uri("http://example.com/embed%2fded");
Console.WriteLine(uri.AbsoluteUri); // prints: http://example.com/embed/ded

(注: URIの出力にUri.ToStringを使用しないでください。)

Microsoft Connectでのこの問題のバグレポートによると、この動作は仕様によるものですが、app.configまたはweb.configファイルに以下を追加することで回避できます。

<uri>
  <schemeSettings>
    <add name="http" genericUriParserOptions="DontUnescapePathDotsAndSlashes" />
  </schemeSettings>
</uri>

WebRequest.Create(string)に委任するだけなのでWebRequest.Create(Uri)、どのメソッドを呼び出すかに関係なく、この回避策を使用する必要があります。)

于 2012-05-02T14:10:31.587 に答える