gpt4 book ai didi

C# WebRequest.getResponse() : 400 Bad Request

转载 作者:太空狗 更新时间:2023-10-29 19:53:10 24 4
gpt4 key购买 nike

我正在尝试使用 System.Web 从服务器下载文件。它确实有效,但有些链接给我带来了麻烦。链接如下所示:

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

代码基本上是这样的:

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

getResponse() 总是抛出异常(Error 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(链接);//链接未解码 Debug.WriteLine(uri.ToString());//链接在这里解码。

我怎样才能避免这种情况?

预先感谢您的帮助。

最佳答案

默认情况下,Uri 类不允许在 URI 中使用转义的 / 字符 (%2f)(即使这看起来在我阅读 RFC 3986 时是合法的)。

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

(注意:don't use Uri.ToString 打印 URI。)

根据bug report for this issue在 Microsoft Connect 上,此行为是设计使然,但您可以通过将以下内容添加到您的 app.config 或 web.config 文件来解决此问题:

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

(因为 WebRequest.Create(string) 只是委托(delegate)给 WebRequest.Create(Uri),所以无论您调用哪种方法,您都需要使用此解决方法。)

关于C# WebRequest.getResponse() : 400 Bad Request,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10413795/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com