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

Является ли HttpWebRequest реализованным по-разному в mono и .net?

Я пытаюсь перенести облачный api С# в mono, и у меня возникают проблемы с созданием HTTP-запроса.

Я выделил этот метод для настройки запроса, но HttpWebRequest.ContentLength окажется равным -1 в моно, но это .net, контент правильно построен.

Я запускаю новейшую Xamarin Studio на Mac, и я создаю библиотеку MONO/.NET 4.0 Моно версия: 2.10.12

EDIT: Упрощенный код, этот тест проходит в Visual Studio, но не удается в студии Xamarin

EDIT: код будет нажат на github, если кто-то захочет помочь

    [Test]
    public void StreamTest()
    {
        var request = System.Net.HttpWebRequest.Create("http://foo.com");
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";
        using (var writer = new System.IO.StreamWriter(request.GetRequestStream()))
        {
            writer.Write("anything");
        }

        Assert.IsTrue(request.ContentLength > 0);
    }
4b9b3361

Ответ 1

Когда вы делаете

System.Net.HttpWebRequest.Create("http://foo.com");

вы фактически создаете экземпляр внутреннего класса System.Net.Browser.BrowserHttpWebRequest

Вот иерархия наследования

System.Net.WebRequest
  System.Net.HttpWebRequest
    System.Net.Browser.PolicyBasedWebRequest
      System.Net.Browser.BrowserHttpWebRequest

Длина содержимого обрабатывается в PolicyBasedWebRequest, инициализируется в ctor с -1 и никогда не изменяется; Я предлагаю вам вручную установить его.

Ответ 2

Смотрите здесь: Xamarin Forum

Предлагается заменить это:

byte[] buffer = Encoding.GetEncoding("UTF-8").GetBytes(bundleString);
string result = Convert.ToBase64String(buffer);
StreamWriter requestWriter = new StreamWriter(httpWebRequest.GetRequestStream());
requestWriter.Write(result, 0, result.Length);
requestWriter.Flush();
requestWriter.Close();

с этим:

httpWebRequest.ContentLength = bundleString.Length;
StreamWriter requestWriter = new StreamWriter(httpWebRequest.GetRequestStream());
requestWriter.Write(bundleString);
requestWriter.Flush();
requestWriter.Close();

исправлена ​​проблема. Вы можете попробовать это.