2011-01-18 2 views
0

Я не работал с 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, в отличие от других? Опять же, я проверил строку, которая попадает в поток, она правильная и такая же для всех тестовых приложений.

Заранее спасибо.

+0

Хм. Похоже, вам нужно запустить wirehark на сервере и обнюхать входящий трафик. Затем сравните различия в запросе/ответе между тремя вашими клиентами. – feroze

+0

Спасибо, это звучит здорово. Проблема в том, что у меня нет такого доступа к серверу, и для проведения такого теста потребуется довольно много времени. Мне просто интересно, есть ли известная проблема с MonoTouch, которая может вызвать это, потому что это похоже на проблему с картой? – Kiril

+0

Я просто хочу сказать, что я переустановил MonoDevelop, и теперь все работает нормально. Я до сих пор не знаю, что вызвало эту проблему. – Kiril

ответ

1

Переустановлено MonoDevelop и проблема исчезла.

Смежные вопросы