2011-01-18 5 views
0

저는 Monotouch (또는 그 문제에 대해서는 iphone)와 관련하여 너무 오랫동안 작업하지 않았기 때문에 내 문제는 경험과 관련이 있다고 생각합니다.Monotouch의 HttpWebRequest 문제

json을 통해 웹 서비스와 통신해야하는 응용 프로그램을 만들었습니다. 여기에있는 포팅 된 Json.NET 라이브러리를 사용했습니다 : https://github.com/chrisntr/Newtonsoft.Json

먼저 Json.NET 라이브러리를 사용하여 Windows 애플리케이션을 만들었습니다. 신속하게 사용해 보았습니다. 그것은 완벽하게 작동했습니다. 그런 다음 MonoDevelop에 똑같은 코드를 작성하고 서버가 쿼리를 전혀 인식 할 수 없다는 오류 메시지를 반환합니다. serializer가 제대로 작업하는지 확인했습니다. json 문자열의 형식이 올바르게 지정되어 있습니다. 또한 두 응용 프로그램은 서버에서 응답을 수신 할 때까지 동일한 방식으로 작동합니다. 내가 먼저, 서버는 컨텐츠 헤더가 "응용 프로그램/JSON"로 설정했기 때문에 내 쿼리를 인식 할 수 있으며 쿼리를 필요로하기 때문에 키 - 값 쌍으로 전달되는 Windows 응용 프로그램을 작성

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)); 
     } 

("쿼리"를 키로 사용). 이것이 w.Write ("query ="+ sWriter.ToString())의 이유입니다. . 서비스를 호출하는 예제로 제공된 PHP 스크립트에서이 행은 다음과 같이 설정되었습니다. curl_setopt ($ ch, CURLOPT_POSTFIELDS, array ('query'=> jsonEncode ($ data)));

그러나 콘텐츠 형식 헤더를 수정하고 문자열 앞에 "query ="를 추가 한 이후 코드는 Visual Studio 및 Mono Develop에서 완벽하게 작동합니다. Java로 작성한 후에도 Android 휴대 전화에서 실행되었습니다. 그러나 MonoTouch에서는 서버가 항상 요청 스트림을 쿼리로 인식하지 못합니다. 이것의 원인이 무엇일까요? MonoTouch의 요청 스트림에서 일어나는 특별한 일이 있습니까? 다시 말하지만, 스트림에 들어가는 문자열을 검사했는데, 모든 테스트 응용 프로그램에 대해 정확하고 동일합니다.

미리 감사드립니다.

+0

흠. 서버에서 wireshark를 실행하고 들어오는 트래픽을 탐지해야하는 것처럼 보입니다. 그런 다음 보유한 세 클라이언트 간의 요청/응답의 차이점을 비교하십시오. – feroze

+0

감사합니다. 문제는 서버에 대한 액세스 권한이 없으며 그러한 테스트를 준비하는 데 꽤 오래 걸리는 것입니다. MonoTouch가 프레임 워크 문제처럼 보이기 때문에이 문제를 일으킬 수있는 몇 가지 알려진 문제가 있는지 궁금합니다. – Kiril

+0

나는 MonoDevelop를 재설치했다가 갑자기 모든 것이 잘 작동한다고 말하고 싶다. 나는 아직도이 문제의 원인을 모르고있다. – Kiril

답변

1

MonoDevelop를 재설치하고 문제가 사라졌습니다.

관련 문제