我正在使用下面的代码(需要是 .Net 2.0)在 UAT 服务器上连接到客户 FTP 服务器以上传/下载文件。我需要使用他们提供的自签名证书通过端口 990 进行连接。我已经修改了防火墙规则,以允许从我们的 UAT 服务器连接到端口 990 上的 URI。
但是(!:))我在线上超时
Stream requestStream = request.GetRequestStream();
如果我增加超时时间,那没有什么区别。
我在网上浏览了一下,但没有发现代码中缺少任何明显的内容。
如果我使用 CuteFTP 在 UAT 服务器上进行连接,那么它自然可以正常连接,我可以手动进行文件传输。如果我使用 WireShark 查看网络流量,它会从 FTP 服务器获得响应,但从不为用户 ID 和 pwd(代码)握手,但通过 CuteFTP,所有网络流量都很好。
我在检查证书的地方强制返回 True。
private void button4_Click(object sender, EventArgs e)
{
try
{
string completeFTPPath = ConfigurationManager.AppSettings["FTPPath"];
// get the object used to communicate with the server.
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(completeFTPPath);
request.EnableSsl = true;
request.Credentials = new NetworkCredential(ConfigurationManager.AppSettings["FtpUserName"], ConfigurationManager.AppSettings["FtpPassword"]);
request.Method = WebRequestMethods.Ftp.UploadFile;
ServicePointManager.ServerCertificateValidationCallback = AcceptAllCertifications;
// read file into byte array
StreamReader sourceStream = new StreamReader(ConfigurationManager.AppSettings["LocalFilePath"]);
byte[] fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());
sourceStream.Close();
request.ContentLength = fileContents.Length;
// send bytes to server
MessageBox.Show("GetRequestStream() start");
Stream requestStream = request.GetRequestStream();
requestStream.Write(fileContents, 0, fileContents.Length);
requestStream.Close();
MessageBox.Show("GetRequestStream() end");
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
MessageBox.Show("Response status: " + response.StatusDescription);
}
catch (WebException we)
{
MessageBox.Show(we.Message);
}
catch (Exception exc)
{
MessageBox.Show(exc.Message);
}
}
public bool AcceptAllCertifications(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certification, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors)
{ return true; }
例如 FTPPath - ftp://111.222.333.444:990/UAT/testFile.zip;FtpUserName - 用户 ID;FtpPassword = 用户密码;LocalFilePath - c:\temp\testFile.zip
有人有什么想法吗?因为有些人似乎有上面的代码工作。TIA。