4

我正在使用下面的代码(需要是 .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。

4

5 回答 5

1

在端口 990 上,服务器很可能支持隐式 FTPS,而不是更标准的显式 FTPS。可能是 FtpWebRequest 不支持隐式 FTPS(我不知道)。

如果是这样,请查看edtFTPnet/PRO,它支持隐式和显式 FTPS 以及 SFTP。

于 2009-09-07T06:44:29.917 回答
1

试试EnterpriseDT 库

于 2009-09-07T07:01:38.267 回答
0

在 .Net 中打开跟踪并重现问题,然后发布生成的日志,我会告诉你出了什么问题。.Net 2.0 中的 FtpWebRequest 中有一些已知问题,因此您也可能遇到其中一个问题,但仅凭您显示的代码是不可能的。可以在此处找到打开跟踪的说明:http: //blogs.msdn.com/dgorti/archive/2005/09/18/471003.aspx

于 2009-08-31T01:54:03.583 回答
-1

当使用 FTP 上传文件时,我通常会像这样创建 FtpWebRequest 对象:

string address = "ftp://www.companyname.com/UAT/"
string fileName = "testFile.zip"
UriBuilder uriBuilder = new UriBuilder(address);
FtpWebRequest  request = (FtpWebRequest)WebRequest.Create(uriBuilder.ToString() + fileName);

试一试,看看会发生什么,我知道这适用于显式 SSL 和端口 990。

于 2009-10-13T16:33:36.290 回答
-1

我最初也确实看过这个,但它并没有给我带来太多启示。

我刚才再次运行了跟踪,并使用了 Durgaprasad 帖子中的 SSL system.diagnostics 设置。

System.Net Verbose: 0 : [7016] WebRequest::Create(ftp://www.companyname.com:990/UAT/testFile.zip)
System.Net Information: 0 : [7016] FtpWebRequest#48285313::.ctor(ftp://www.companyname.com:990/UAT/testFile.zip)
System.Net Verbose: 0 : [7016] Exiting WebRequest::Create()     -> FtpWebRequest#48285313
System.Net Verbose: 0 : [7016] FtpWebRequest#48285313::GetRequestStream()
System.Net Information: 0 : [7016] FtpWebRequest#48285313::GetRequestStream(Method=STOR.)
System.Net.Sockets Verbose: 0 : [7016] Socket#31914638::Socket(InterNetwork#2)
System.Net.Sockets Verbose: 0 : [7016] Exiting Socket#31914638::Socket() 
System.Net.Sockets Verbose: 0 : [7016] Socket#31914638::Connect(131:990#-2083582714)
System.Net.Sockets Verbose: 0 : [7016] Exiting Socket#31914638::Connect() 
System.Net Information: 0 : [7016] Associating FtpWebRequest#48285313 with FtpControlStream#18796293
System.Net.Sockets Verbose: 0 : [7016] Socket#31914638::Receive()
System.Net.Sockets Error: 0 : [7016] Exception in the Socket#31914638::Receive - A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond
System.Net.Sockets Verbose: 0 : [7016] Exiting Socket#31914638::Receive()   -> 0#0
System.Net.Sockets Verbose: 0 : [7016] Socket#31914638::Dispose()
System.Net Information: 0 : [7016] FtpWebRequest#48285313::(Releasing FTP connection#18796293.)
System.Net Error: 0 : [7016] Exception in the FtpWebRequest#48285313::GetRequestStream - The operation has timed out.
System.Net Error: 0 : [7016]    at System.Net.FtpWebRequest.GetRequestStream()
System.Net Verbose: 0 : [7016] Exiting FtpWebRequest#48285313::GetRequestStream() 

另外,(在之前运行此程序时)我让网络团队运行 Netmon,他们从下面暗示,这是与代码相关的:


  TCP    kulccstgweb02:2673     companyname.com:microsoft -ds  ESTABLISHED
  TCP    kulccstgweb02:2678     companyname IP:ftps    ESTABLISHED
  TCP    kulccstgweb02:sms-chat  companyname IP:ftps    ESTABLISHED

顺便说一句,FTPPath -“ ftp://111.222.333.444:990/UAT/testFile.zip ”实际上是“ ftp://www.companyname.com:990/UAT/testFile.zip ”,然后解析为IP . 但我不明白这会产生什么影响。

于 2009-08-31T04:37:44.070 回答