【发布时间】:2013-04-25 15:04:36
【问题描述】:
我有一个 API,它接收 XML 并最终根据 XML 中的信息上传文件。上传是按计划进行的(也来自 XML),我已经测试了它周围的所有东西,并且知道它可以工作。
我在每个时间周期中尝试上传的第一个文件大约有 40% 的时间出现错误(时间周期 = 某些文件为 45 分钟,其他文件为 30 分钟)。
这是我的上传代码:
try {
LoggerFTP.Log("Uploading file: " + filename, false);
// Create the request.
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(appSettingsFTP.ftpUrl + @"/" + filename);
request.Method = WebRequestMethods.Ftp.UploadFile;
request.Timeout = 6000000; //set to 100 minutes
//request.Timeout = -1; //set to infinite
// Add the login credentials.
request.Credentials = new NetworkCredential(appSettingsFTP.ftpLogin, appSettingsFTP.ftpPassword);
// Grab the file contents.
StreamReader sourceStream = new StreamReader(appSettingsFTP.uploadFileDirectory + filename);
byte[] fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());
sourceStream.Close();
request.ContentLength = fileContents.Length;
// Copy the file contents to the outgoing stream.
Stream requestStream = request.GetRequestStream();
requestStream.Write(fileContents, 0, fileContents.Length);
requestStream.Close();
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
//Logger.Log(filename.ToString() + " " + "Upload Complete, Status: " + response.StatusCode + " " + response.StatusDescription, false);
//Took response.StatusDescription out because it appears to be creating extra line feeds.
LoggerFTP.Log(filename.ToString() + " " + "Upload Complete, Status: " + response.StatusCode, false);
}
catch (Exception ex) {
LoggerFTP.Log(ex.ToString(), false);
}
我已经研究了这个问题,并在网上看到了一些关于它可能是一个速度问题。就像,有一个超时。但是我将 FtpWebRequest 的超时设置为 100 分钟,所以不可能是这样吗?我不知道。这也是作为服务运行的,因此很难测试代码的这方面。
这是在我的记录器(e.ToString)中记录的异常:
System.Net.WebException: System error. ---> System.Net.InternalException: System error.
at System.Net.PooledStream.PrePush(Object expectedOwner)
at System.Net.ConnectionPool.PutConnection(PooledStream pooledStream, Object owningObject, Int32 creationTimeout, Boolean canReuse)
at System.Net.FtpWebRequest.FinishRequestStage(RequestStage stage)
at System.Net.FtpWebRequest.SyncRequestCallback(Object obj)
at System.Net.FtpWebRequest.RequestCallback(Object obj)
at System.Net.CommandStream.Dispose(Boolean disposing)
at System.IO.Stream.Close()
at System.IO.Stream.Dispose()
at System.Net.ConnectionPool.Destroy(PooledStream pooledStream)
at System.Net.ConnectionPool.PutConnection(PooledStream pooledStream, Object owningObject, Int32 creationTimeout, Boolean canReuse)
at System.Net.FtpWebRequest.AttemptedRecovery(Exception e)
at System.Net.FtpWebRequest.SubmitRequest(Boolean async)
--- End of inner exception stack trace ---
at System.Net.FtpWebRequest.GetRequestStream()
at CPMainSpringAPIExportsSC.UploadFTP.FTPUploadMethod(String viewname, String filename)
【问题讨论】:
-
我遇到了类似的错误,您找到解决方案了吗?
-
我其实不知道我做了什么。我查看了我的日志文件并意识到错误仍然偶尔发生,但更不频繁。你让它工作几次还是大部分时间?它发生的事实并没有打扰我,因为我在 15 分钟后上传了另一个,而且它几乎从来没有连续两次失败。
-
是的,我的有时也会做一些奇怪的事情。但就像我说的那样,它发生得太少了,我无法回去修复它。已经部署,客户很高兴 =)。祝你好运,伙计。希望我知道该说些什么来提供帮助。
-
你想让我为你赏金吗?我可以抽出 50 个代表,看看是否有人回答。
-
我经常遇到这个问题,它似乎取决于通信基础设施。我们有一个可以通过 3G 或 WiFi 连接的嵌入式设备,我们很少在 WiFi 上看到这种情况,但在 3G 上经常看到这种情况,在某些地方,即使互联网与其他应用程序(如浏览器)配合良好,我们也会一直得到这种情况。我很乐意捐赠 100 个赏金来找出原因并找出解决办法。
标签: c# ftp ftpwebrequest