2011-01-17 40 views
18

Điều này hơi phức tạp.Mã trạng thái từ phương thức FTPWebRequest.GetResponse()

Tôi đang tải tệp lên FTP một cách không đồng bộ. Sau khi tải lên từng tệp, tôi đang kiểm tra trạng thái của thao tác tải lên cho tệp đó. Điều này có thể được thực hiện với thuộc tính StatusCode của đối tượng FtpWebResponse cho yêu cầu đó. Đoạn mã được đưa ra dưới đây.

FileStream fs = File.Open(fileName, FileMode.Open); 

while ((iWork = fs.Read(buf, 0, buf.Length)) > 0) 
    requestStream.Write(buf, 0, iWork); 

requestStream.Close(); 

FtpWebResponse wrRet = ((FtpWebResponse)state.Request.GetResponse()); 

Có khoảng 37 giá trị StatusCode theo msdn. Tôi không biết rằng các giá trị mã trạng thái nào sẽ đảm bảo rằng tệp được tải lên thành công. Một số người trong số họ tôi đã sử dụng trong mã của mình để kiểm tra thành công là:

wrRet.StatusCode == FtpStatusCode.CommandOK 
wrRet.StatusCode == FtpStatusCode.ClosingData 
wrRet.StatusCode == FtpStatusCode.ClosingControl 
wrRet.StatusCode == FtpStatusCode.ConnectionClosed 
wrRet.StatusCode == FtpStatusCode.FileActionOK 
wrRet.StatusCode == FtpStatusCode.FileStatus 

Nhưng tôi không biết phần còn lại. Tôi cần phải chắc chắn về các mã này bởi vì dựa trên sự thất bại hoặc thành công của hoạt động tải lên, tôi có các hoạt động phụ thuộc khác được thực hiện. Một điều kiện sai có thể ảnh hưởng đến mã còn lại. Một ý nghĩ khác mà tôi nghĩ là chỉ cần đặt mã ở trên vào một lần thử..kết hợp và không phụ thuộc vào các mã trạng thái này. Với điều này tôi sẽ không phụ thuộc vào mã trạng thái và giả định rằng bất kỳ lỗi nào sẽ luôn được chuyển đến khối catch. Vui lòng cho tôi biết nếu đây là cách phù hợp.

+0

Tôi gặp sự cố với máy chủ FTP. Tôi sẽ đi với một giải pháp thực dụng và chỉ cần kiểm tra xem các tập tin chỉ cần tải lên máy chủ có thể được tìm thấy một lần nữa sau khi tải lên. Tôi biết nó không trả lời câu hỏi - nhưng tôi chỉ đi đến kết luận rằng tôi không thể tin tưởng các máy chủ FTP phản ứng – MacGyver

Trả lời

6

FtpStatusCode.ConnectionClosed426Connection closed; transfer aborted vì vậy tôi nghĩ đó sẽ là một thất bại thực sự. Bất cứ điều gì trong phạm vi 2XX nói chung phải là một thành công. Đối với các ứng dụng khách FTP mà tôi đã xây dựng mà tôi chỉ nhớ nhận được để tải lên thành công là 226 - FtpStatusCode.ClosingData

+0

Cảm ơn Chris. Nhưng như tôi đã nói ở trên, tôi cũng đã kiểm tra giá trị ClosingData. Hầu hết thời gian hoặc hầu như luôn trong môi trường phát triển của tôi, tôi nhận được trạng thái này. Nhưng bằng cách nào đó trong môi trường sản xuất tôi nhận được một vấn đề. (Tôi đang tải lại tệp nếu mã trạng thái không khớp với bất kỳ tệp nào trong số chúng như đã đề cập trong bài đăng ở trên của tôi. Tệp này thực sự được tải lên hai lần.) Có một số mã trạng thái khác được truy xuất mà không phải là một trong số đó như tôi đã đề cập ở trên , nhưng vẫn là một trường hợp thành công. Bất kỳ ý tưởng về điều này? – Nishant

+1

Tôi khuyên bạn nên bật truy tìm System.Net và xem liệu bạn có thể nhận thêm thông tin về lý do tải lên không thành công hay không. http://blogs.msdn.com/b/dgorti/archive/2005/09/18/471003.aspx –

+0

@Nishant Có nhiều mã trạng thái khác nhau do phiên bản RFC FTP khác nhau nhưng bạn phải chắc chắn phiên bản nào của FTP bạn đang sử dụng và sau đó bạn nên sử dụng các mã FTP rõ ràng tốt hơn sử dụng SFTP hoặc FTPS. –

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