Я не работал с Monotouch (или iphone в этом отношении) слишком долго, поэтому, я думаю, моя проблема связана с опытом.Проблема с HttpWebRequest с MonoTouch
Я создал приложение, которое нужно связать с веб-сервисом через json. Я использовал портативную библиотеку Json.NET, найденную здесь: https://github.com/chrisntr/Newtonsoft.Json
Сначала я создал приложение Windows, используя библиотеку Json.NET, чтобы быстро попробовать его. Он отлично работал. Затем я написал тот же точный код в MonoDevelop, и сервер возвращает сообщение об ошибке, которое вообще не может распознать запрос. Обратите внимание, что я проверил, правильно ли работает сериализатор - строка json отформатирована правильно. Более того, оба приложения ведут себя одинаково до получения ответа от сервера.
JsonSerializer serializer = new JsonSerializer();
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(the uri of the service);
request.Method = "post";
request.ContentType = "application/x-www-form-urlencoded";
Query login = new Query(); // the object that will be serialized
login.module = "auth";
login.data.Add("username", username goes here);
login.data.Add("password", password goes here);
using (Stream s = request.GetRequestStream())
{
using (StreamWriter w = new StreamWriter(s))
{
StringWriter sWriter = new StringWriter(new StringBuilder());
serializer.Serialize(sWriter, login);
w.Write("&query="+sWriter.ToString());
}
}
using (HttpWebResponse resp = request.GetResponse() as HttpWebResponse)
{
var reader = new StreamReader(resp.GetResponseStream());
JsonReader r = new JsonTextReader(reader);
Response login_response = (Response)serializer.Deserialize(reader, typeof(Response));
}
Когда я первый написал окна приложения, сервер не может распознать мои запросы, потому что заголовок Content был установлен на «применение/JSON» и потому, что он требует запроса будет поставляться в качестве пары ключ-значение (с «запросом» в качестве ключа). В этом причина w.Write ("query =" + sWriter.ToString()); , В php-скрипте, который был предоставлен в качестве примера вызова службы, эта строка была настроена следующим образом: curl_setopt ($ ch, CURLOPT_POSTFIELDS, array ('query' => jsonEncode ($ data)));
Однако, поскольку я исправил заголовки содержимого и добавил «query =» перед строкой, код отлично работает в Visual Studio и Mono Develop. Он даже работал на моем телефоне Android после того, как я написал его на Java. Однако в MonoTouch сервер всегда не распознает поток запросов в качестве запроса. Что может быть причиной этого? есть ли что-то особенное, что происходит с потоком запросов в MonoTouch, в отличие от других? Опять же, я проверил строку, которая попадает в поток, она правильная и такая же для всех тестовых приложений.
Заранее спасибо.
Хм. Похоже, вам нужно запустить wirehark на сервере и обнюхать входящий трафик. Затем сравните различия в запросе/ответе между тремя вашими клиентами. – feroze
Спасибо, это звучит здорово. Проблема в том, что у меня нет такого доступа к серверу, и для проведения такого теста потребуется довольно много времени. Мне просто интересно, есть ли известная проблема с MonoTouch, которая может вызвать это, потому что это похоже на проблему с картой? – Kiril
Я просто хочу сказать, что я переустановил MonoDevelop, и теперь все работает нормально. Я до сих пор не знаю, что вызвало эту проблему. – Kiril