1

Monotouch の Web クライアント経由で XML を送信しようとしています。すべてが iOS シミュレーターで動作していますが、アプリがデバイスで実行されているときに例外が発生します。これがコードです。

try
{
   Byte[] sendData = System.Text.Encoding.UTF8.GetBytes(someXML) ;
   WebClient client = new WebClient();
   Byte[] forResp;
   client.Headers.Add("Content-Type","text/xml");

   bresp = wc.UploadData(URL, sendData);
   string resp = System.Text.Encoding.ASCII.GetString(forResp);
   XmlDocument xresp = new XmlDocument();
   xresp.LoadXml(resp);
   return xresp;
}
catch
{
    // error
}

HttpWebRequest で同じ問題が発生したため、WebClient を試しました。

例外:

The request timed out
System.Net.WebException: The request timed out
  at System.Net.HttpWebRequest.EndGetResponse (IAsyncResult asyncResult) [0x00065] in /Developer/MonoTouch/Source/mono/mcs/class/System/System.Net/HttpWebRequest.cs:830 
  at System.Net.HttpWebRequest.GetResponse () [0x0000e] in /Developer/MonoTouch/Source/mono/mcs/class/System/System.Net/HttpWebRequest.cs:836 
  at System.Net.WebClient.GetWebResponse (System.Net.WebRequest request) [0x00000] in /Developer/MonoTouch/Source/mono/mcs/class/System/System.Net/WebClient.cs:1433 
  at System.Net.WebClient.ReadAll (System.Net.WebRequest request, System.Object userToken) [0x00000] in /Developer/MonoTouch/Source/mono/mcs/class/System/System.Net/WebClient.cs:866 
  at System.Net.WebClient.UploadDataCore (System.Uri address, System.String method, System.Byte[] data, System.Object userToken) [0x00038] in /Developer/MonoTouch/Source/mono/mcs/class/System/System.Net/WebClient.cs:462 
  at System.Net.WebClient.UploadData (System.Uri address, System.String method, System.Byte[] data) [0x00035] in /Developer/MonoTouch/Source/mono/mcs/class/System/System.Net/WebClient.cs:441 
4

1 に答える 1

2

スタックトレースは、サーバーからの応答を取得しようとしたときにタイムアウトが発生したWebClientことを示しています (データをサーバーにアップロードするときではありません)。これは、サーバーへのアクセスが問題ではないことを意味します (そして、なぜスタックトレースが非常に便利なのか ;-)

次の手順は、サーバーを制御できるかどうかによって異なります。サーバーを制御している場合は、ログをチェックしてリクエストを見つけ、それがどのように処理されたかを確認してください。可能であれば、シミュレーターとデバイスの間で同じようにデータを受信/デコードしたことも確認してください。

サーバーを制御しないと、内部で何が起こっているかを知るのが難しくなります。たとえば、リクエストが気に入らなかった可能性があります (つまり、サーバー コードは、ユーザー エージェントを含む任意の条件に基づいて応答しないことを決定できます)。

そのような場合は、 のようなツールを使用するのwiresharkが最善の方法です。iOS シミュレーターとデバイスからのセッションを比較します。

  • リクエストは同じですか?たとえば、アップロードしたデータが別の理由で異なる場合があります。

  • サーバーはデバイスに応答していますか? 同じステータスコードで?同じ時間枠で?

すべてが同一である場合は、バグが見つかった可能性があります。(上記の情報とファイルと共に) http://bugzilla.xamarin.comに報告してください。

それ以外の場合は、問題をデバッグしたり、質問をより具体的に更新したりするためのより正確な手がかりが必要です:-)

于 2012-04-19T12:53:26.437 に答える