2014-04-14 2 views
1

필자는 windows-mobile 6.5 응용 프로그램을 빌드하고 (cf 2.0을 기반으로) 한 가지 방법의 특수한 테스트 케이스에 문제가 있습니다. 그래서 누군가가 내게 조언을 주거나이 행동의 이유가 무엇인지 유용한 정보를 얻을 수 있기를 바랍니다.서버 오류 발생 후 http 연결이 가능하지 않습니다. 503

이 메서드는 스레드 내부에서 30 초마다 연속 호출되며 HTTP를 통해 전송할 파일을 찾습니다. 웹 서버 (jboss)에 요청하여 도중으로 가져옵니다. 서버 자체가 내 통제하에 있습니다.

웹 서버를 중지하고 강제로 503 서버 오류가 발생할 때까지 모든 것이 정상적으로 작동합니다. 여태까지는 그런대로 잘됐다. 그러나 웹 서버를 다시 시작한 후에는 전송 메소드의 다음 호출이 성공적으로 끝나기를 기대합니다.하지만 그렇게하지는 않습니다. 이후의 모든 시도는 타임 아웃 예외로 끝나며 다시 작동하도록 응용 프로그램을 다시 시작해야합니다.

내 질문은 : 이전 시도가 오류 503과 함께 실패한 후 uri에 연결할 때 문제가 어디에 있습니까? 캐시 된 것이 있지만 그게 무엇일까?

모든 힌트에 대해 감사드립니다.

위르겐

public static Boolean HttpUploadFile2(string url, string file) 
    { 
     HttpWebRequest requestToServer = null; 
     WebResponse response  = null; 
     try 
     { 
      Logger.writeToLogFileCom(string.Format("Uploading {0} to {1}", file, url)); 
      requestToServer = (HttpWebRequest)WebRequest.Create(url); 
      requestToServer. Timeout = 40000; 
      string boundaryString = "----SSLBlaBla"; 
      requestToServer.AllowWriteStreamBuffering = false; 
      requestToServer.Method = "POST"; 
      requestToServer.ContentType = "multipart/form-data; 
      boundary=" + boundaryString; 
      requestToServer.KeepAlive = false; 
      ASCIIEncoding ascii = new ASCIIEncoding(); 
      string boundaryStringLine = "\r\n--" + boundaryString + "\r\n"; 
      byte[] boundaryStringLineBytes = ascii.GetBytes(boundaryStringLine); 
      string lastBoundaryStringLine = "\r\n--" + boundaryString + "--\r\n"; 
      byte[] lastBoundaryStringLineBytes = ascii.GetBytes(lastBoundaryStringLine); 
      // Get the byte array of the myFileDescription content disposition 
      string myFileDescriptionContentDisposition = String.Format(
       "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}", 
       "myFileDescription", 
       "A sample file description"); 
      byte[] myFileDescriptionContentDispositionBytes 
       = ascii.GetBytes(myFileDescriptionContentDisposition); 
      string fileUrl = file; 
      // Get the byte array of the string part of the myFile content 
      // disposition 
      string myFileContentDisposition = String.Format(
       "Content-Disposition: form-data;name=\"{0}\"; " 
       + "filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n", 
       "myFile", Path.GetFileName(fileUrl), Path.GetExtension(fileUrl)); 
      byte[] myFileContentDispositionBytes = 
       ascii.GetBytes(myFileContentDisposition); 
      FileInfo fileInfo = new FileInfo(fileUrl); 
      // Calculate the total size of the HTTP request 
      long totalRequestBodySize = boundaryStringLineBytes.Length * 2 
       + lastBoundaryStringLineBytes.Length 
       + myFileDescriptionContentDispositionBytes.Length 
       + myFileContentDispositionBytes.Length 
       + fileInfo.Length; 
      // And indicate the value as the HTTP request content length 
      requestToServer.ContentLength = totalRequestBodySize; 
      // Write the http request body directly to the server     
      using (Stream s = requestToServer.GetRequestStream()) 
      { 

       //TIMEOUT OCCURED WHEN CALLING GetRequestStream 


       // Send the file description content disposition over to the server 
       s.Write(boundaryStringLineBytes, 0, boundaryStringLineBytes.Length); 
       s.Write(myFileDescriptionContentDispositionBytes, 0, 
        myFileDescriptionContentDispositionBytes.Length); 
       // Send the file content disposition over to the server 
       s.Write(boundaryStringLineBytes, 0, boundaryStringLineBytes.Length); 
       s.Write(myFileContentDispositionBytes, 0, 
        myFileContentDispositionBytes.Length); 
       // Send the file binaries over to the server, in 1024 bytes chunk 
       FileStream fileStream = new FileStream(fileUrl, FileMode.Open, 
        FileAccess.Read); 
       byte[] buffer = new byte[1024]; 
       int bytesRead = 0; 
       Logger.writeToLogFileCom("writing data..."); 
       while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0) 
       { 
        s.Write(buffer, 0, bytesRead); 
       } // end while      
       fileStream.Close(); 
       Logger.writeToLogFileCom("... finished, File closed"); 
       // Send the last part of the HTTP request body 
       s.Write(lastBoundaryStringLineBytes, 0, lastBoundaryStringLineBytes.Length); 
       Logger.writeToLogFileCom("... finished, File closed"); 
      } // end using   

      // Grab the response from the server. WebException will be thrown 
      // when a HTTP OK status is not returned 
      Logger.writeToLogFileCom("lese Response"); 
      response = requestToServer.GetResponse(); 
      StreamReader responseReader = new StreamReader(response.GetResponseStream()); 
      string replyFromServer = responseReader.ReadToEnd(); 
      response.Close();     
      if (Regex.Split(Regex.Split(replyFromServer, "content\\:RESPONSE\"\\>")[1], "\\</span\\>")[0].Equals("OK")) 
      {      
       return true; 
      } 
      else 
      {     
       return false; 
      } 
     } 
     catch (Exception ex) 
     { 
      Logger.writeToLogFileCom("Fehler im HTML Sender"); 
      Logger.writeToLogFileCom(ex.Message); 
      Logger.writeToLogFileCom(ex.StackTrace); 
     } 
     finally 
     { 
      try 
      { 
       if (response != null) 
       {       
        response.Close(); 
       } 
      } 
      catch (Exception ex) { } 
     } 
     return false; 

    } 

답변

1

나는이 문제를 해결했다.

finally 절 안에 try/catch 블록을 추가하여 모든 상황에서 getResponse를 호출했습니다.

finally 
    { 

     try { response = requestToServer.GetResponse(); } 
     catch (Exception ex) { } 

    [...] 
관련 문제