Как заставить System.Uri не выводить% 2f (косую черту) в пути? - PullRequest
11 голосов
/ 25 апреля 2011

Конструктор System.Uri настаивает на удалении последовательностей% 2f в виде наклонных слэшей, когда он видит их в части пути URL. Как я мог избежать такого поведения?

Я видел Connect тикет на этом жесте, но обходной путь не работает для .net 4, насколько я понимаю.

Ответы [ 3 ]

6 голосов
/ 25 апреля 2011

Внутренняя исходная строка сохраняется, например, следующий код:

    Uri u = new Uri("http://www.example.com/path?var=value%2fvalue");
    Console.WriteLine(u.OriginalString);

будет отображать

http://www.example.com/path?var=value%2fvalue

РЕДАКТИРОВАТЬ : я обновил коднаходится в Обходном соединении Link 101 * для последних версий .NET.Вот оно:

// System.UriSyntaxFlags is internal, so let's duplicate the flag privately
private const int UnEscapeDotsAndSlashes = 0x2000000;
private const int SimpleUserSyntax = 0x20000;

public static void LeaveDotsAndSlashesEscaped(Uri uri)
{
    if (uri == null)
        throw new ArgumentNullException("uri");

    FieldInfo fieldInfo = uri.GetType().GetField("m_Syntax", BindingFlags.Instance | BindingFlags.NonPublic);
    if (fieldInfo == null)
        throw new MissingFieldException("'m_Syntax' field not found");

    object uriParser = fieldInfo.GetValue(uri);
    fieldInfo = typeof(UriParser).GetField("m_Flags", BindingFlags.Instance | BindingFlags.NonPublic);
    if (fieldInfo == null)
        throw new MissingFieldException("'m_Flags' field not found");

    object uriSyntaxFlags = fieldInfo.GetValue(uriParser);

    // Clear the flag that we don't want
    uriSyntaxFlags = (int)uriSyntaxFlags & ~UnEscapeDotsAndSlashes;
    uriSyntaxFlags = (int)uriSyntaxFlags & ~SimpleUserSyntax;
    fieldInfo.SetValue(uriParser, uriSyntaxFlags);
}

Конечно, это хак, поэтому вы должны использовать его на свой страх и риск: -)

3 голосов
/ 05 июня 2012

Как я уже писал в этот вопрос , вы можете отключить это поведение через конфигурацию:

<configuration>
  <uri>
    <schemeSettings>
      <add name="http" genericUriParserOptions="DontUnescapePathDotsAndSlashes"/>
    </schemeSettings>
  </uri>
</configuration>
1 голос
/ 19 января 2012

Попробуйте URI.EscapeUriString перед созданием нового URI. %2F выглядит как %252F, и в моем случае это прекрасно работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...