2011-01-18 2 views
0

私はMonotouch(またはその問題についてはiphone)を長時間使っていないので、私の問題は経験に関連していると思います。MonotouchのHttpWebRequestの問題

jsonを介してWebサービスと通信する必要があるアプリケーションを作成しました。私はここにある移植Json.NETライブラリを使用しました:https://github.com/chrisntr/Newtonsoft.Json

最初に、私はすぐにそれを試してみるために、Json.NETライブラリを使用してWindowsアプリケーションを作成しました。それは完璧に働いた。 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)); 
     } 

私が最初にコンテンツヘッダは、「アプリケーション/ JSON」に設定されたため、それは(キーと値のペアとして配信されるようにクエリを必要とするため、サーバーが私のクエリを認識できなかった、Windowsアプリケーションを書きました「クエリ」をキーとして)。これが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

Hmm。サーバー上でwiresharkを実行し、入ってくるトラフィックを傍受する必要があるように見えます。次に、3つのクライアント間の要求/応答の違いを比較します。 – feroze

+0

ありがとう、それは素晴らしいね。問題は、サーバーへのアクセス権がなく、そのようなテストを手配するにはかなりの時間がかかることです。私はフレームワークの問題のように見えるので、これを引き起こすMonoTouchの既知の問題があるかどうか疑問に思っていましたか? – Kiril

+0

私はMonoDevelopを再インストールしたと言っていますが、今は突然すべてが正常に動作します。私はまだこの問題の原因を何も知らない。 – Kiril

答えて

1

MonoDevelopを再インストールして問題が消えました。

関連する問題