HttpWebRequest реализован по-разному в моно и.net?
Я пытаюсь перенести облачный api C# на mono, и у меня возникают некоторые проблемы при создании http-запроса.
Я выделил этот метод для настройки запроса, но HttpWebRequest.ContentLength оказывается равным -1 в моно, но это.net, содержимое правильно построено.
Я использую новейшую Xamarin Studio на Mac и собираю библиотеку MONO / .NET 4.0 Mono версия: 2.10.12
РЕДАКТИРОВАТЬ: упрощенный код, этот тест проходит в Visual Studio, но не проходит в студии Xamarin
РЕДАКТИРОВАТЬ: Код отправляется на 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);
}
2 ответа
Когда вы делаете
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 и никогда не изменяется; Я предлагаю вам установить его вручную.
Смотрите здесь: 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();
исправил проблему. Вы можете попробовать это.