1

我构建了一个 windows-mobile 6.5 应用程序(基于 cf 2.0)并且对一种方法的特殊测试用例有问题。所以我希望有人能给我一个建议或有一个有用的想法,这种行为的原因是什么......

该方法每 30 秒从线程内部连续调用一次,查找要通过 HTTP 请求传输到 Web 服务器 (jboss) 的文件,然后将它们带上。服务器 url 本身在我的控制之下。

一切正常……直到我停止 Web 服务器并强制出现 503 服务器错误。到目前为止,一切都很好。但是在重新启动 Web 服务器后,我希望下一次调用 transfer 方法将成功结束 - 但事实并非如此。每次进一步的尝试都会以超时异常结束,我必须重新启动应用程序以使其再次工作。

所以我的问题是:问题出在哪里,当我想在之前的尝试失败并出现错误 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;

    }
4

1 回答 1

1

我解决了这个问题。

我在 finally 子句中添加了一个额外的 try/catch 块,以便在每种情况下调用 getResponse。

    finally
    {

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

    [...]
于 2014-04-15T11:48:07.307 回答