Экранирование полной остановки перед косой чертой в строке URL

#c# #url-encoding

#c# #url-кодировка

Вопрос:

Я обнаружил странность, которую пытаюсь обойти с помощью C #, очищающей / вмешивающейся в указанный URL-адрес и в результате выдающей 404.

Это происходит там, где после полной остановки есть косая черта — C # и Visual Studio полны решимости удалить полную остановку.

Для Visual Studio это щелчок элемента управления в строке, ссылающейся на неверно сформированный URL

В скомпилированном C # строка преобразуется даже до перехода к новому URI().

Ссылка:

http://www.mattmulholland.co.nz/Matt_Mulholland/Matt_Mulholland_-_Official_Website._Boom./rss.xml

(Проблема возникает из-за ‘./’ в конце)

Я пытался экранировать как полную остановку косую черту в ASCII, так и параметр ‘dontEscape’ в конструкторе Uri (), но пока безуспешно…

И другие мысли о том, как я могу заставить эту строку разрешить правильный URL?

Спасибо.

Комментарии:

1. На что похоже ваше экранирование? Что происходит, когда вы используете этот URL: http://www.mattmulholland.co.nz/Matt_Mulholland/Matt_Mulholland_-_Official_Website._Boom./rss.xml

Ответ №1:

Это то, что я использую:

     // call this line only once in application lifetime (when app starts)
    ApplyFixEndDotUrl();

    // --------------------------
    Uri testUrl = new Uri("http://www.mattmulholland.co.nz/Matt_Mulholland/Matt_Mulholland_-_Official_Website._Boom./rss.xml");
    string strUrl = testUrl.ToString();

    // --------------------------
    // -> using System.Reflection;

    public static void ApplyFixEndDotUrl()
    {
        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 amp;amp; 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);

                    if ((flagsValue amp; 0x1000000) != 0)
                        flagsField.SetValue(parser, flagsValue amp; ~0x1000000);
                }
            }
        }
    }
  

Это решение находится здесь: HttpWebRequest к URL с точкой в конце (платформа .NET 2.0)