2012-02-27 1 views
2

У меня есть клиентское приложение, запущенное на C# на устройстве .NETCF 3.5. POST для сервлетов Java, расположенных удаленно. Я получаю «Request Timed out» во время моего третьего HTTP POST для того же сервлета. Например, если сервлет управляет входом на наш Java-сервер, первые два попытки входа из клиента будут проходить (одно и то же клиентское устройство), и когда я попытаюсь выполнить третий, он вернется в исключение «Запрошенное время» из сервер. Я заметил, что это происходит всегда, и я не могу понять проблему. Я прочитал, что C# по умолчанию отправляет запрос 100 в заголовках HTTP, поэтому я использовал ServicePointManager, чтобы установить запрос 100 в false, но безрезультатно.«Запросить время», когда makinng два HttpWebRequests на тот же сервер Java из C# над .NET Compact

Вот код, который бросает эту ошибку:

  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. Вы всегда должны обработать ответ и закрыть его. В противном случае третья попытка HTTP Webrequest завершится с тайм-аутом, который ограничен WinCE.

После исходного код будет безопасным:

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

+0

Полезно знать! Можете ли вы поделиться своим источником относительно ограничений WinCE с помощью WebRequests и ответов? – Rishi