2011-01-17 30 views
18

これはややこしいことです。FTPWebRequest.GetResponse()メソッドのステータスコード

ファイルをFTPに非同期でアップロードしています。 各ファイルをアップロードした後、そのファイルのアップロード操作のステータスを確認しています。これは、その要求のFtpWebResponseオブジェクトのStatusCodeプロパティで行うことができます。 コードスニペットは次のとおりです。

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()); 

msdnには、約37個のStatusCode値があります。これらのステータスコード値のどれがファイルが正常にアップロードされることを保証するかはわかりません。私のコードで成功を確認するために使用したものは次のとおりです。

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

私は残りの部分を認識していません。私はこれらのコードについて確かめる必要があります。なぜなら、アップロード操作の失敗または成功に基づいて、私は他の従属操作を実行する必要があるからです。状態が間違っていると残りのコードに影響を与えることがあります。 もう一つの考えは、上記のコードをtry..catchに入れて、これらのステータスコードに依存しないことでした。これで私は状態コードに依存せず、どんな失敗も常にキャッチブロックに向けられると仮定します。これが正しい方法であれば教えてください。

+0

私は実用的な解決策をとって、サーバーにアップロードされたばかりのファイルがアップロード後に再び見つかるかどうかを確認するだけです。私はそれが質問に答えていないことを知っています - しかし、私はFTPサーバーの応答を信頼できないという結論に達しました – MacGyver

答えて

6

FtpStatusCode.ConnectionClosedはであるので、実際は失敗すると思います。 2XXの範囲のものは、一般的には成功するはずです。成功したアップロードの受信を覚えているだけのFTPクライアントを構築したFTPクライアントの場合は、FTPサーバーで問題が発生しています。226 - FtpStatusCode.ClosingData

+0

ありがとうChris。しかし、私は上記で述べたように、ClosingDataの値もチェックしました。私の開発環境ではほとんどの場合、ほとんど常にこの状態になります。しかし、何らかの形で生産環境で私は問題を抱えています。 (上記のように、ステータスコードがdonotと一致していれば、ファイルをもう一度アップロードしています。ファイルは実際に2回アップロードされています。)上記のように他のステータスコードが取得されています、それでも成功の一例です。これに関するアイデア? – Nishant

+1

System.Netのトレースをオンにして、アップロードが失敗した理由について詳しい情報が得られるかどうかを確認することをおすすめします。 http://blogs.msdn.com/b/dgorti/archive/2005/09/18/471003.aspx –

+0

@Nishant FTP RFCのバージョンが異なるため、さまざまなステータスコードが存在しますが、どのバージョンのあなたが使用しているFTPを使用して、明確なFTPコードを使用して、SFTPまたはFTPSを使用することをお勧めします。 –

関連する問題