2012-02-27 5 views
2

.NETCF 3.5デバイスでC#で実行されているクライアントアプリケーションがリモートにあるJavaサーブレットにポストする。私は、同じサーブレットに対する3回目のHTTP POSTの実行中に「Request Timed out」を受信して​​います。たとえば、サーブレットがJavaサーバーへのログインを管理している場合、クライアントからの最初の2回のログイン試行(同じクライアントデバイス)が実行され、3回目の試行では「リクエストタイムアウト」例外が返されますサーバ。私はこれがいつも起こっていることに気付きました。問題を理解することはできません。私は、デフォルトでC#がリクエスト100をHTTPヘッダーに継続して送信するので、ServicePointManagerを使用して要求100をfalseに設定して無駄にすることを読んでいます。ここで2つのHttpWebRequestsを同じJavaサーバーにC#から.NETコンパクトで作成するときに「要求のタイムアウト」が発生する

は、このエラーを投げているコードです:

  serverUrl = url; 
      string responseFromServer = ""; 
      try 
      { 
       System.Net.ServicePointManager.Expect100Continue = false; 
       int tmp = ServicePointManager.DefaultConnectionLimit; 
       // Create a request using a URL that can receive a post. 
       request = (HttpWebRequest)WebRequest.Create(url); 
       // Set the Method property of the request to POST. 
       request.Method = "POST"; 
       // Create POST data and convert it to a byte array.    
       byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(url); 
       // Set the ContentType property of the WebRequest. 
       request.ContentType = "application/x-www-form-urlencoded";     
       // Set the ContentLength property of the WebRequest. 
       request.ContentLength = byteArray.Length; 
       request.Timeout = (50 * 100); 
       request.Proxy = System.Net.GlobalProxySelection.GetEmptyWebProxy(); 
       // Get the request stream. 
       Stream dataStream = request.GetRequestStream(); 
       // Write the data to the request stream. 
       dataStream.Write(byteArray, 0, byteArray.Length); 
       // Close the Stream object. 
       dataStream.Close(); 
       // Get the response. 
       response = (HttpWebResponse)request.GetResponse(); 
       // Get the stream containing content returned by the server. 
       dataStream = response.GetResponseStream(); 
       // Open the stream using a StreamReader for easy access. 
       StreamReader reader = new StreamReader(dataStream); 
       // Read the content. 
       responseFromServer = reader.ReadToEnd(); 
       // Clean up the streams. 
       reader.Close(); 
       dataStream.Close(); 
       response.Close(); 

       return responseFromServer; 
      } 
      catch (Exception WebExp) 
      { 
       Logging.Instance.Log(Logging.Levels.Error, "Error in DoPost while retrieving : "+url+ " " + WebExp.Message.ToString()); 
       Logging.Instance.Log(Logging.Levels.Error, WebExp.StackTrace.ToString()); 
       throw WebExp; 
      } 

任意の助けもいただければ幸いです。ありがとう!

+0

私はちょうどそれが働いたと私は二度目(その第三にログインしたときに、それが失敗したかどうかを確認するために、ログイン/ログアウトと私のアプリを打ちました。 HTTP POST)を使用して、サーバー上のログアウト機構が壊れていたのか、クライアント上の私のPOSTが失敗したのかを調べました。これが私が何度もログインしている理由です。私はそれがほとんど意味がないことを知っていますが、私のPOSTが壊れている場所を確認するための集中テストのようなものです。 – Rishi

答えて

3

この動作は、WebResponseに関する誤った例外処理が原因です。あなたはいつもレスポンスを処理し、それを閉じる必要があります。さもなければ、WinCEによって制限されたタイムアウトでHTTP Webrequestの3回目の試行が失敗します。ソースコードに続いて

は安全になります。

HttpWebResponse response = null; 
try 
{ 
    //... 
    response = (HttpWebResponse)request.GetResponse(); 
    //... 
} 
catch(Exception e) 
{ 
    // logging, etc. 
    throw e; 
} 
finally 
{ 
    if(response!=null) 
    { 
     response.Close(); 
    } 
} 

+0

お役立ち情報WebRequestsとResponsesを使ってWinCEの制限についてあなたのソースを共有できますか? – Rishi

関連する問題