1

我在System.Uri课堂上有一个意想不到的行为。当创建 的实例System.Uri,并且UrlString有一些模式,如...、 或...#、 或.#时,System.Uri删除所有重复的.字符。

这很奇怪,但我相信这种行为是基于 RFC 2396。

当我尝试从以下 URL 下载 HTML 时,问题就开始了:http ://www.submarino.com.br/produto/1/23853463/mundo+segundo+steve+jobs,+o:+as+frases+mais+灵感+ ...

并且System.Uri删除所有重复.的s。由于网站无法识别“新 URL”,它会重定向到原始 URL。然后抛出“System.Net.WebException:尝试了太多自动重定向”并且永远无法到达该页面。

我该如何解决这个问题?

4

1 回答 1

1

您可以使用反射来删除该特定属性。Uri在你打电话之前使用这个:

MethodInfo getSyntax = typeof(UriParser).GetMethod("GetSyntax", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);
FieldInfo flagsField = typeof(UriParser).GetField("m_Flags", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
if (getSyntax != null && flagsField != null)
{
    foreach (string scheme in new[] { "http", "https" })
    {
        UriParser parser = (UriParser)getSyntax.Invoke(null, new object[] { scheme });
        if (parser != null)
        {
            int flagsValue = (int)flagsField.GetValue(parser);
            // Clear the CanonicalizeAsFilePath attribute
            if ((flagsValue & 0x1000000) != 0)
                flagsField.SetValue(parser, flagsValue & ~0x1000000);
        }
    }
}

之前已经向Connect报告过

于 2012-04-29T00:47:00.200 回答