私は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でリクエストストリームに起こる特別なことは他にもありますか?繰り返しますが、ストリームに入る文字列をチェックしました。これはすべてのテストアプリケーションで正しいと同じです。
ありがとうございます。
Hmm。サーバー上でwiresharkを実行し、入ってくるトラフィックを傍受する必要があるように見えます。次に、3つのクライアント間の要求/応答の違いを比較します。 – feroze
ありがとう、それは素晴らしいね。問題は、サーバーへのアクセス権がなく、そのようなテストを手配するにはかなりの時間がかかることです。私はフレームワークの問題のように見えるので、これを引き起こすMonoTouchの既知の問題があるかどうか疑問に思っていましたか? – Kiril
私はMonoDevelopを再インストールしたと言っていますが、今は突然すべてが正常に動作します。私はまだこの問題の原因を何も知らない。 – Kiril