对FTP了解的进来讨论下 我在项目中使用ftp操作上传这块,ftp站点和web站点发布在一个IIS上,上传几个文件后程序就会卡死,两个站点分开放在不同的机器上问题就不会出现,不知道大家遇过这问题没? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 没有用过IIS的FTP,我下的是serv-u,管理的,蛮强大的 一般不用windows 自带。lz 的问题大概是FTP和IIS权限配置有点问题吧... 其次我用.net自带ftp类库操作的上传这块。 从LZ 分开放没有问题这点来看可能是用一个IIS的时候2个站点公用了一个应用程序池建议建立2个不同的应用程序池来对应不同的站点另外你的FTP站点应该考虑以下几个问题:1. FTP是否有超时问题?2. FTP是否允许上传大于4M的文件 win2003中,ftp站点没有使用应用程序池。 win2003中,ftp站点没有使用应用程序池。 是我的理解有误,这里的FTP站点应该是指: IIS 的FTP服务在 FTP站点-> 链接超时这个地方尝试设置的大一点的值 另外,建议LZ具体抓一下 “卡死” 时的FTP 会话状态,可以到IIS FTP站点->当前会话里 看一下客户端状态。 另外,建议LZ具体抓一下 “卡死” 时的FTP 会话状态,可以到IIS FTP站点->当前会话里 看一下客户端状态。今早我查看了下会话状态,发现怎么会有25个用户,而且都是同一行用户,我的工作流是这样的, 一个分公司拥有一台文件服务器,也就是一个用户名, 那么在一个分公司下上传文件时会话应该保持一个啊,不应该出现25个,似乎看到这步卡死还是有道理的。到这一步怎么优化呢? 另外,建议LZ具体抓一下 “卡死” 时的FTP 会话状态,可以到IIS FTP站点->当前会话里 看一下客户端状态。通过跟踪我发现文件上传了25个就卡死了,此时正好会话连接次数也到了25个,问题似乎找到了端倪,但是为什么分开搭建就可以呢。上传代码: if (baseFile == null) { throw new ArgumentNullException("文件句柄不能为空"); } Stream requestStream = null; Stream fileStream = null; //获取文件长度 int FileLength = baseFile.ContentLength; //限制上传文件最大不能超过500M if (FileLength < 500 * 1024 * 1024) { try { if (!GetFileList()) { FtpCheckDirectoryExist(ftpFilePath); } //格式化为URI Uri uri = new Uri(ftpUrl + ftpFilePath + filename); ftpRequest = (FtpWebRequest)WebRequest.Create(uri);//创建FtpWebRequest实例uploadRequest ftpRequest.Method = WebRequestMethods.Ftp.UploadFile;//将FtpWebRequest属性设置为上传文件 ftpRequest.UseBinary = true; ftpRequest.KeepAlive = false; //上传完一次则销毁服务器的连接. ftpRequest.Credentials = new NetworkCredential(ftpUser, ftpPwd);//认证FTP用户名密码 int bufferlen = 2048; byte[] buffer = new byte[bufferlen]; //获得用于上传FTP的流 requestStream = ftpRequest.GetRequestStream(); fileStream = baseFile.InputStream; //截取FileUpload1获取的文件流,作为上传FTP的流 int len = fileStream.Read(buffer, 0, bufferlen); while (len > 0) { requestStream.Write(buffer, 0, bufferlen); len = fileStream.Read(buffer, 0, bufferlen); } requestStream.Close(); requestStream.Dispose(); fileStream.Close(); fileStream.Dispose(); //ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();//返回FTP服务器响应,上传完成 } catch (Exception ex) { } } else { //上传文件过大 } 1. 关于为什么会有25个用户....从LZ贴的代码上看不到有明显问题,唯一可以改进的是 try...catch...final ,把释放链接放到FINAL中,然后建议把 CATCH exception 的内容记录下来。2. 不过一到25个就卡死说明你服务器FTP的端口 允许的最大链接被限制了,有几个地方可以设置最大链接数 一个是 IIS本身,还有就是路由器防火墙中(通常在跨网段应用中会遇到这个问题)。 1. 关于为什么会有25个用户....从LZ贴的代码上看不到有明显问题,唯一可以改进的是 try...catch...final ,把释放链接放到FINAL中,然后建议把 CATCH exception 的内容记录下来。2. 不过一到25个就卡死说明你服务器FTP的端口 允许的最大链接被限制了,有几个地方可以设置最大链接数 一个是 IIS本身,还有就是路由器防火墙中(通常在跨网段应用中会遇到这个问题)。1、我在调用的地方已经加了using,他会释放闲置资源,2、FTP站点连接我设置为1000, 25个我的意思是当文件上传到25个时系统便会卡死,这时去查看会话数量是25个,把web站点分开架设时其实会话连接也不会停的增长,但是不会卡死。 那我估计问题应该是这样的:服务端的FTP链接数被限制为25个了,导致你客户端链接第26个线程时,一直在WAIT。所以出现了"卡死"验证这个判断的方法是: 在 客服端执行 “netstat -n” 看与服务器FTP 端口的 第26个链接是否一直是 TIME_WAIT。如果是的话问题肯定就出在这个地方。————————————假设以上判断正确:那解决方法有以下几个:1. 查找 链接数被限制的原因,通常来自路由和防火墙之类的设备。2. 或者修改FTP客户端,确保一个客户端只有一个链接。(我估计你使用了多线程上传文件所以会出现一个客户端有N个会话。 那我估计问题应该是这样的:服务端的FTP链接数被限制为25个了,导致你客户端链接第26个线程时,一直在WAIT。所以出现了"卡死"验证这个判断的方法是: 在 客服端执行 “netstat -n” 看与服务器FTP 端口的 第26个链接是否一直是 TIME_WAIT。如果是的话问题肯定就出在这个地方。————————————假设以上判断正确:那解决方法有以下几个:1. 查找 链接数被限制的原因,通常来自路由和防火墙之类的设备。2. 或者修改FTP客户端,确保一个客户端只有一个链接。(我估计你使用了多线程上传文件所以会出现一个客户端有N个会话。FTP服务器的连接我设置的1000个。 那我估计问题应该是这样的:服务端的FTP链接数被限制为25个了,导致你客户端链接第26个线程时,一直在WAIT。所以出现了"卡死"验证这个判断的方法是: 在 客服端执行 “netstat -n” 看与服务器FTP 端口的 第26个链接是否一直是 TIME_WAIT。如果是的话问题肯定就出在这个地方。————————————假设以上判断正确:那解决方法有以下几个:1. 查找 链接数被限制的原因,通常来自路由和防火墙之类的设备。2. 或者修改FTP客户端,确保一个客户端只有一个链接。(我估计你使用了多线程上传文件所以会出现一个客户端有N个会话。FTP服务器的连接我设置的1000个。限制链接数的地方不光是IIS 路由等设备亦可限制。你的环境是跨网段的还是同网段的? 那我估计问题应该是这样的:服务端的FTP链接数被限制为25个了,导致你客户端链接第26个线程时,一直在WAIT。所以出现了"卡死"验证这个判断的方法是: 在 客服端执行 “netstat -n” 看与服务器FTP 端口的 第26个链接是否一直是 TIME_WAIT。如果是的话问题肯定就出在这个地方。————————————假设以上判断正确:那解决方法有以下几个:1. 查找 链接数被限制的原因,通常来自路由和防火墙之类的设备。2. 或者修改FTP客户端,确保一个客户端只有一个链接。(我估计你使用了多线程上传文件所以会出现一个客户端有N个会话。FTP服务器的连接我设置的1000个。限制链接数的地方不光是IIS 路由等设备亦可限制。你的环境是跨网段的还是同网段的?目前是在局域网内测试,web站点和ftp站点在同一台服务器上。 刚才我接着测试,在会话数量达到25个时,我把已有的连接全部手动断开,此时让文件继续上传,还是持卡死状态,可见问题可能不在这里,因为web站点和ftp站点分开是不存在问题的,会话连接自己闲置时就会自动关闭。 内网的话,肯定不存在连接数限制。这样的话,难道是FTP服务配置有问题? 有没有用其他FTP软件,测试一下 看服务器能否突破25线程限制? 另外,建议LZ具体抓一下 “卡死” 时的FTP 会话状态,可以到IIS FTP站点->当前会话里 看一下客户端状态。通过跟踪我发现文件上传了25个就卡死了,此时正好会话连接次数也到了25个,问题似乎找到了端倪,但是为什么分开搭建就可以呢。上传代码: if (baseFile == null) { throw new ArgumentNullException("文件句柄不能为空"); } Stream requestStream = null; Stream fileStream = null; //获取文件长度 int FileLength = baseFile.ContentLength; //限制上传文件最大不能超过500M if (FileLength < 500 * 1024 * 1024) { try { if (!GetFileList()) { FtpCheckDirectoryExist(ftpFilePath); } //格式化为URI Uri uri = new Uri(ftpUrl + ftpFilePath + filename); ftpRequest = (FtpWebRequest)WebRequest.Create(uri);//创建FtpWebRequest实例uploadRequest ftpRequest.Method = WebRequestMethods.Ftp.UploadFile;//将FtpWebRequest属性设置为上传文件 ftpRequest.UseBinary = true; ftpRequest.KeepAlive = false; //上传完一次则销毁服务器的连接. ftpRequest.Credentials = new NetworkCredential(ftpUser, ftpPwd);//认证FTP用户名密码 int bufferlen = 2048; byte[] buffer = new byte[bufferlen]; //获得用于上传FTP的流 requestStream = ftpRequest.GetRequestStream(); fileStream = baseFile.InputStream; //截取FileUpload1获取的文件流,作为上传FTP的流 int len = fileStream.Read(buffer, 0, bufferlen); while (len > 0) { requestStream.Write(buffer, 0, bufferlen); len = fileStream.Read(buffer, 0, bufferlen); } requestStream.Close(); requestStream.Dispose(); fileStream.Close(); fileStream.Dispose(); //ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();//返回FTP服务器响应,上传完成 } catch (Exception ex) { } } else { //上传文件过大 }你的代码有问题while (len > 0) { requestStream.Write(buffer, 0, bufferlen); len = fileStream.Read(buffer, 0, bufferlen); }其中一行要改成 requestStream.Write(buffer, 0, buffer.Length); 写错了,是requestStream.Write(buffer, 0, len); 服务器是什么版本?IIS和FTP用了共同的目录吗?你用其它方式上传文件试试,已排除代码的干扰。 win2003 IIS6.0 说起目录,都是放在d盘, 不同文件夹 先用其它ftp客户端上传文件试试,看有没有问题服务器是否补丁是否打全找到个问题和你类似的http://www.experts-exchange.com/Software/Server_Software/Web_Servers/Microsoft_IIS/Q_23290142.html serv-u是付费的。FileZilla 有服务器版和客户端版两种全免费,配置简单,FTP功能足够用了。客户端也可用它的. 能不能将异步获取转换成同步 UDP 通信服务端出错 C#编写的Windows Service程序问题 求助 ArrayList 问题 请为我要实现这样的效果该怎么办? 如何得到一段代码的运行时间,请进来给菜鸟看看。 求助 ▲△▲△ 这是.NET Framework的bug吗?AttributeUsage的Inherited属性对Property无效! 关于定时器的问题,请高手帮忙。急!!!! PC、Android与WCF C# 调用C++ dll C#中WebService和一般的业务类有什么区别吗?
lz 的问题大概是FTP和IIS权限配置有点问题吧...
其次我用.net自带ftp类库操作的上传这块。
建议建立2个不同的应用程序池来对应不同的站点另外你的FTP站点应该考虑以下几个问题:
1. FTP是否有超时问题?
2. FTP是否允许上传大于4M的文件
win2003中,ftp站点没有使用应用程序池。
win2003中,ftp站点没有使用应用程序池。 是我的理解有误,这里的FTP站点应该是指: IIS 的FTP服务在 FTP站点-> 链接超时这个地方尝试设置的大一点的值
另外,建议LZ具体抓一下 “卡死” 时的FTP 会话状态,可以到IIS FTP站点->当前会话里 看一下客户端状态。
另外,建议LZ具体抓一下 “卡死” 时的FTP 会话状态,可以到IIS FTP站点->当前会话里 看一下客户端状态。今早我查看了下会话状态,发现怎么会有25个用户,而且都是同一行用户,
我的工作流是这样的, 一个分公司拥有一台文件服务器,也就是一个用户名, 那么在一个分公司下上传文件时会话应该保持一个啊,不应该出现25个,似乎看到这步卡死还是有道理的。到这一步怎么优化呢?
另外,建议LZ具体抓一下 “卡死” 时的FTP 会话状态,可以到IIS FTP站点->当前会话里 看一下客户端状态。通过跟踪我发现文件上传了25个就卡死了,此时正好会话连接次数也到了25个,问题似乎找到了端倪,但是为什么分开搭建就可以呢。上传代码: if (baseFile == null)
{
throw new ArgumentNullException("文件句柄不能为空");
} Stream requestStream = null;
Stream fileStream = null;
//获取文件长度
int FileLength = baseFile.ContentLength;
//限制上传文件最大不能超过500M
if (FileLength < 500 * 1024 * 1024)
{
try
{
if (!GetFileList())
{
FtpCheckDirectoryExist(ftpFilePath);
}
//格式化为URI
Uri uri = new Uri(ftpUrl + ftpFilePath + filename);
ftpRequest = (FtpWebRequest)WebRequest.Create(uri);//创建FtpWebRequest实例uploadRequest
ftpRequest.Method = WebRequestMethods.Ftp.UploadFile;//将FtpWebRequest属性设置为上传文件
ftpRequest.UseBinary = true;
ftpRequest.KeepAlive = false; //上传完一次则销毁服务器的连接.
ftpRequest.Credentials = new NetworkCredential(ftpUser, ftpPwd);//认证FTP用户名密码
int bufferlen = 2048;
byte[] buffer = new byte[bufferlen];
//获得用于上传FTP的流
requestStream = ftpRequest.GetRequestStream();
fileStream = baseFile.InputStream; //截取FileUpload1获取的文件流,作为上传FTP的流
int len = fileStream.Read(buffer, 0, bufferlen);
while (len > 0)
{
requestStream.Write(buffer, 0, bufferlen);
len = fileStream.Read(buffer, 0, bufferlen);
} requestStream.Close();
requestStream.Dispose();
fileStream.Close();
fileStream.Dispose();
//ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();//返回FTP服务器响应,上传完成
}
catch (Exception ex)
{ }
}
else
{
//上传文件过大
}
1. 关于为什么会有25个用户....从LZ贴的代码上看不到有明显问题,唯一可以改进的是 try...catch...final ,把释放链接放到FINAL中,然后建议把 CATCH exception 的内容记录下来。2. 不过一到25个就卡死说明你服务器FTP的端口 允许的最大链接被限制了,有几个地方可以设置最大链接数 一个是 IIS本身,还有就是路由器防火墙中(通常在跨网段应用中会遇到这个问题)。
1. 关于为什么会有25个用户....从LZ贴的代码上看不到有明显问题,唯一可以改进的是 try...catch...final ,把释放链接放到FINAL中,然后建议把 CATCH exception 的内容记录下来。2. 不过一到25个就卡死说明你服务器FTP的端口 允许的最大链接被限制了,有几个地方可以设置最大链接数 一个是 IIS本身,还有就是路由器防火墙中(通常在跨网段应用中会遇到这个问题)。1、我在调用的地方已经加了using,他会释放闲置资源,
2、FTP站点连接我设置为1000, 25个我的意思是当文件上传到25个时系统便会卡死,这时去查看会话数量是25个,把web站点分开架设时其实会话连接也不会停的增长,但是不会卡死。
那我估计问题应该是这样的:服务端的FTP链接数被限制为25个了,导致你客户端链接第26个线程时,一直在WAIT。所以出现了"卡死"验证这个判断的方法是: 在 客服端执行 “netstat -n” 看与服务器FTP 端口的 第26个链接是否一直是 TIME_WAIT。如果是的话问题肯定就出在这个地方。————————————
假设以上判断正确:
那解决方法有以下几个:
1. 查找 链接数被限制的原因,通常来自路由和防火墙之类的设备。
2. 或者修改FTP客户端,确保一个客户端只有一个链接。(我估计你使用了多线程上传文件所以会出现一个客户端有N个会话。
那我估计问题应该是这样的:服务端的FTP链接数被限制为25个了,导致你客户端链接第26个线程时,一直在WAIT。所以出现了"卡死"验证这个判断的方法是: 在 客服端执行 “netstat -n” 看与服务器FTP 端口的 第26个链接是否一直是 TIME_WAIT。如果是的话问题肯定就出在这个地方。————————————
假设以上判断正确:
那解决方法有以下几个:
1. 查找 链接数被限制的原因,通常来自路由和防火墙之类的设备。
2. 或者修改FTP客户端,确保一个客户端只有一个链接。(我估计你使用了多线程上传文件所以会出现一个客户端有N个会话。
FTP服务器的连接我设置的1000个。
那我估计问题应该是这样的:服务端的FTP链接数被限制为25个了,导致你客户端链接第26个线程时,一直在WAIT。所以出现了"卡死"验证这个判断的方法是: 在 客服端执行 “netstat -n” 看与服务器FTP 端口的 第26个链接是否一直是 TIME_WAIT。如果是的话问题肯定就出在这个地方。————————————
假设以上判断正确:
那解决方法有以下几个:
1. 查找 链接数被限制的原因,通常来自路由和防火墙之类的设备。
2. 或者修改FTP客户端,确保一个客户端只有一个链接。(我估计你使用了多线程上传文件所以会出现一个客户端有N个会话。
FTP服务器的连接我设置的1000个。限制链接数的地方不光是IIS 路由等设备亦可限制。
你的环境是跨网段的还是同网段的?
那我估计问题应该是这样的:服务端的FTP链接数被限制为25个了,导致你客户端链接第26个线程时,一直在WAIT。所以出现了"卡死"验证这个判断的方法是: 在 客服端执行 “netstat -n” 看与服务器FTP 端口的 第26个链接是否一直是 TIME_WAIT。如果是的话问题肯定就出在这个地方。————————————
假设以上判断正确:
那解决方法有以下几个:
1. 查找 链接数被限制的原因,通常来自路由和防火墙之类的设备。
2. 或者修改FTP客户端,确保一个客户端只有一个链接。(我估计你使用了多线程上传文件所以会出现一个客户端有N个会话。
FTP服务器的连接我设置的1000个。限制链接数的地方不光是IIS 路由等设备亦可限制。
你的环境是跨网段的还是同网段的?目前是在局域网内测试,web站点和ftp站点在同一台服务器上。
这样的话,难道是FTP服务配置有问题? 有没有用其他FTP软件,测试一下 看服务器能否突破25线程限制?
另外,建议LZ具体抓一下 “卡死” 时的FTP 会话状态,可以到IIS FTP站点->当前会话里 看一下客户端状态。通过跟踪我发现文件上传了25个就卡死了,此时正好会话连接次数也到了25个,问题似乎找到了端倪,但是为什么分开搭建就可以呢。上传代码: if (baseFile == null)
{
throw new ArgumentNullException("文件句柄不能为空");
} Stream requestStream = null;
Stream fileStream = null;
//获取文件长度
int FileLength = baseFile.ContentLength;
//限制上传文件最大不能超过500M
if (FileLength < 500 * 1024 * 1024)
{
try
{
if (!GetFileList())
{
FtpCheckDirectoryExist(ftpFilePath);
}
//格式化为URI
Uri uri = new Uri(ftpUrl + ftpFilePath + filename);
ftpRequest = (FtpWebRequest)WebRequest.Create(uri);//创建FtpWebRequest实例uploadRequest
ftpRequest.Method = WebRequestMethods.Ftp.UploadFile;//将FtpWebRequest属性设置为上传文件
ftpRequest.UseBinary = true;
ftpRequest.KeepAlive = false; //上传完一次则销毁服务器的连接.
ftpRequest.Credentials = new NetworkCredential(ftpUser, ftpPwd);//认证FTP用户名密码
int bufferlen = 2048;
byte[] buffer = new byte[bufferlen];
//获得用于上传FTP的流
requestStream = ftpRequest.GetRequestStream();
fileStream = baseFile.InputStream; //截取FileUpload1获取的文件流,作为上传FTP的流
int len = fileStream.Read(buffer, 0, bufferlen);
while (len > 0)
{
requestStream.Write(buffer, 0, bufferlen);
len = fileStream.Read(buffer, 0, bufferlen);
} requestStream.Close();
requestStream.Dispose();
fileStream.Close();
fileStream.Dispose();
//ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();//返回FTP服务器响应,上传完成
}
catch (Exception ex)
{ }
}
else
{
//上传文件过大
}
你的代码有问题
while (len > 0)
{
requestStream.Write(buffer, 0, bufferlen);
len = fileStream.Read(buffer, 0, bufferlen);
}
其中一行要改成
requestStream.Write(buffer, 0, buffer.Length);
你用其它方式上传文件试试,已排除代码的干扰。
win2003 IIS6.0
说起目录,都是放在d盘, 不同文件夹
服务器是否补丁是否打全
找到个问题和你类似的
http://www.experts-exchange.com/Software/Server_Software/Web_Servers/Microsoft_IIS/Q_23290142.html
serv-u是付费的。FileZilla
有服务器版和客户端版两种
全免费,配置简单,FTP功能足够用了。客户端也可用它的.