试图上传到FTP: system.net.webeexception:系统错误
本文关键字:system net webeexception 系统错误 FTP | 更新日期: 2023-09-27 18:11:04
我有一个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);
}
我研究了这个问题,并在网上看到一些关于它可能是一个速度的事情。比如,有一个暂停。但我有我的超时设置为100分钟为我的FtpWebRequest,所以它不可能是吗?我不知道。这也是作为服务运行的,所以很难测试这方面的代码。
下面是在我的记录器(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)
我在试图通过SSL进行FTP传输的SSIS包中得到了完全相同的堆栈跟踪。在没有SSL的情况下工作得很好,但一旦启用SSL,它就会崩溃。
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.IO.Stream.Close() 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.CheckError() at
System.Net.FtpWebRequest.GetRequestStream() at
ST_0ff7348de65a468bb358ab0206e3721f.ScriptMain.Main() in c:'Users'Stephens'AppData'Local'Temp'Vsta'e664c8a71bb647ff9e9dc6ac32d7b615'ScriptMain.cs:line 155 at
System.Net.FtpWebRequest.CheckError() at
System.Net.FtpWebRequest.GetRequestStream() at
ST_0ff7348de65a468bb358ab0206e3721f.ScriptMain.Main() in c:'Users'Stephens'AppData'Local'Temp'Vsta'e664c8a71bb647ff9e9dc6ac32d7b615'ScriptMain.cs:line 155
因为这个错误是如此普遍,我决定查看。net源代码,看看我是否能抓住什么是错误的线索。如果你去这里:
http://labs.developerfusion.co.uk/SourceViewer/browse.aspx?assembly=SSCLI&名称空间= System.Net {% 22 pageclientstate % % 22 - 2844型% 2 3 22% ccsharp % 22}
并跳到第281行,您将看到内部void PrePush(对象expectedownner)的定义,它是在异常发生时执行的。如下图所示:
internal void PrePush(object expectedOwner)
{
lock (this) {
//3 // The following tests are retail assertions of things we can't allow to happen.
if (null == expectedOwner) {
if (null != m_Owner && null != m_Owner.Target)
throw new InternalException();
// new unpooled object has an owner
}
else {
if (null == m_Owner || m_Owner.Target != expectedOwner)
throw new InternalException();
// unpooled object has incorrect owner
}
m_PooledCount++;
if (1 != m_PooledCount)
throw new InternalException();
// pushing object onto stack a second time
if (null != m_Owner)
m_Owner.Target = null;
}
}
最后我发现FtpWebRequest只支持显式FTP(端口21)而不支持隐式FTP(端口990)。
是否。net FtpWebRequest支持隐式(FTPS)和显式(FTPS) ?
无论如何,在我的情况下,这是一个防火墙的问题。最初我们配置了隐式FTP,即端口989,990,49152-65535(根据供应商的技术人员)。我和我的网络人商量了一下,我们开放了端口20,21,989,990和400000 -655535,之后一切都很顺利。
然而,在您的情况下,您似乎有一些连接池兴奋正在进行。这里有一个关于这个主题的好帖子:
如何提高FtpWebRequest的性能?
你可能想看看你的连接池设置,看看你是否可以取得一些进展。希望这对你有帮助!
问候,斯图尔特
我知道这是一个古老的话题,但对于任何有同样问题的人来说,缺少的代码是:
request.EnableSsl = false;