2009-05-18 26 views
9

Tôi tiếp tục bị ngoại lệ khi tôi cố gắng FTP đến máy chủ Win 2008 của tôi từ mã C# bằng cách sử dụng VS2008 làm trình gỡ lỗi.Đặt số cổng khi sử dụng FtpWebRequest trong C#

lớp thử nghiệm của tôi trông như thế này:

public class FTP 
{ 
    private string ftpServerIP = "192.168.10.35:21"; 
    private string ftpUserID = "Administrator"; 
    private string ftpPassword = "XXXXXXXX"; 
    private string uploadToFolder = "uploadtest"; 

    public void Upload(string filename) 
    { 
     FileInfo fileInf = new FileInfo(filename); 
     string uri = "ftp://" + ftpServerIP + "/" + uploadToFolder + "/" + fileInf.Name; 
     FtpWebRequest reqFTP; 

     reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri)); 
     reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); 
     reqFTP.KeepAlive = false; 
     reqFTP.Method = WebRequestMethods.Ftp.UploadFile; 
     reqFTP.UseBinary = true; 
     reqFTP.ContentLength = fileInf.Length; 

     int buffLength = 2048; 
     byte[] buff = new byte[buffLength]; 
     int contentLen; 

     FileStream fs = fileInf.OpenRead(); 
     try 
     { 
      Stream strm = reqFTP.GetRequestStream(); 
      contentLen = fs.Read(buff, 0, buffLength); 

      while (contentLen != 0) 
      { 
       strm.Write(buff, 0, contentLen); 
       contentLen = fs.Read(buff, 0, buffLength); 
      } 

      strm.Close(); 
      fs.Close(); 
     } 
     catch (Exception ex) 
     { 
      throw new Exception(ex.Message); 
     } 
    } 
} 

Khi tôi thực thi mã tôi nhận được một kết nối không thành công với FTP lỗi 227 trong GetRequestStream() gọi. Trong ngoại trừ tôi có thể nhìn thấy kết nối thất bại trong việc: 192.168.10.35:52184

Tôi không có ý tưởng làm thế nào nó đi kèm với cổng 52184. tôi chỉ định trong ftpServerIP rằng nó phải là cổng 21.

Tôi đã tìm thấy một vài người với cùng một vấn đề trên google nhưng tôi đã không tìm thấy một ví dụ tốt về cách này được giải quyết và tôi vẫn không hiểu tại sao nó xảy ra.

Bất kỳ ai biết cách xử lý vấn đề này ??

CẬP NHẬT:

Tôi đã cố gắng kết nối với một tài khoản FTP khác và tất cả đều hoạt động tốt. Vì vậy, tôi đã thử nghiệm FTP 192.168.10.35:21 nhưng nó hoạt động tốt trong CuteFTP Pro và thích. Điều này chỉ làm cho nó thậm chí còn lạ hơn ..

Trả lời

7

Đoán của tôi là các sự cố tường lửa của Windows, FTP sử dụng các cổng khác so với cổng 21 - đôi khi thay đổi chế độ FTP từ hoạt động sang thụ động giúp mọi thứ hoạt động.

reqFTP.UsePassive = false; 

Nhìn vào bài viết này tốt trên FTP: Active FTP vs. Passive FTP, a Definitive Explanation

+0

Tôi nghĩ rằng tôi thấy sự khác biệt nhưng tôi không thay đổi từ Thụ động sang Hoạt động, có ai có hướng dẫn tốt về điều đó không? –

3

Thies đã làm đúng, nó đã phải làm với chế độ thụ động

Việc sửa chữa trong các mã là quá điên cuồng đơn giản :)

reqFTP.UsePassive = false; 

Và nó hoạt động nhanh và không có lỗi!

1

Điều quan trọng là phải phân biệt cổng COMMAND và cổng DATA. Giao thức kết nối cũng sẽ thay đổi tùy thuộc vào bạn đang ở chế độ HOẠT ĐỘNG hay THỤ ĐỘNG.

ACTIVE CHẾ ĐỘ:

1) Khách hàng bắt đầu một kết nối từ một cổng COMMAND không xác định ngẫu nhiên (N> 1023) đến cảng COMMAND máy chủ mặc định (21). Máy khách sẽ chỉ định cổng DATA (N + 1) của mình và bắt đầu nghe trên cổng này.

2) Máy chủ khởi tạo kết nối từ cổng DATA mặc định (20) của bạn đến cổng DATA của máy khách được chỉ định (N + 1).

Passive Mode:

1) Khách hàng bắt đầu một kết nối từ một cổng ngẫu nhiên không xác định COMMAND (N> 1023) đến cảng COMMAND máy chủ mặc định (21) với lệnh PASSIVE. Máy chủ mở cổng DATA ngẫu nhiên (P> 1023) và gửi cho máy khách.

2) Máy khách khởi tạo kết nối từ cổng DATA (N + 1) đến cổng DATA của máy chủ được chỉ định (P> 1023).

Nếu bạn sử dụng chế độ ACTIVE, rất có thể bạn sẽ cần cho tường lửa của khách hàng chấp nhận kết nối từ máy chủ đến cổng của bạn (N + 1> 1024).

Trong ví dụ của bạn, bạn đang ở chế độ HOẠT ĐỘNG. Khách hàng của bạn đã khởi tạo kết nối từ cổng COMMAND (52183) đến cổng COMMAND mặc định của máy chủ (21) và chỉ định cổng DATA (52184 = 52183 + 1). Sau đó, máy chủ khởi tạo một kết nối từ cổng DATA mặc định (20) của nó đến cổng DATA của máy khách (52184) vốn rất có khả năng bị tường lửa của khách hàng từ chối.

Tôi hy vọng điều này sẽ giúp bạn giải quyết vấn đề của mình!

Các vấn đề liên quan