Подтвердить что ты не робот

Практические различия между URI и закодированными URL-адресами в .Net4.0 vs. Net4.5 с использованием HttpClient

Uri ведет себя по-разному в. Net4.0 vs. Net4.5

var u = new Uri("http://localhost:5984/mycouchtests_pri/test%2F1");
Console.WriteLine(u.OriginalString);
Console.WriteLine(u.AbsoluteUri);

Результат NET4.0

http://localhost:5984/mycouchtests_pri/test%2F1
http://localhost:5984/mycouchtests_pri/test/1

Результат NET4.5

http://localhost:5984/mycouchtests_pri/test%2F1
http://localhost:5984/mycouchtests_pri/test%2F1

Поэтому при использовании HttpClient распространяемого Microsoft через NuGet, запросы, подобные описанным выше, с .Net4.0, поскольку HttpRequestMessage использует Uri > .

Любые идеи для обходного пути?

ИЗМЕНИТЬ Существует НЕПРЕРЫВНОЕ, добавив конфигурацию для <uri>, например. App.config или Machine.config (http://msdn.microsoft.com/en-us/library/ee656539(v=vs.110).aspx).

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

Но поскольку это библиотека инструментов, это не вариант. Если предполагается, что HttpClient для .Net4.0 находится на одном уровне с параметром в .Net4.5, они должны иметь такое же поведение.

4b9b3361

Ответ 1

Майк Хэдлоу написал сообщение в блоге об этом несколько лет назад. Вот код, который он придумал, чтобы обойти это:

private void LeaveDotsAndSlashesEscaped()
{
    var getSyntaxMethod = 
        typeof (UriParser).GetMethod("GetSyntax", BindingFlags.Static | BindingFlags.NonPublic);
    if (getSyntaxMethod == null)
    {
        throw new MissingMethodException("UriParser", "GetSyntax");
    }

    var uriParser = getSyntaxMethod.Invoke(null, new object[] { "http" });

    var setUpdatableFlagsMethod = 
        uriParser.GetType().GetMethod("SetUpdatableFlags", BindingFlags.Instance | BindingFlags.NonPublic);
    if (setUpdatableFlagsMethod == null)
    {
        throw new MissingMethodException("UriParser", "SetUpdatableFlags");
    }

    setUpdatableFlagsMethod.Invoke(uriParser, new object[] {0});
}

Я думаю, что он просто устанавливает флаг, доступный из .config в коде, поэтому, пока он взломан, он не совсем не поддерживается.