#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)