2017-11-03 10 views
2

C#でFtpWebRequestクラスを使用しているときに問題が発生しました。FtpWebRequestは、正しいパスワードを使用して正常に接続した後に間違ったパスワードを無視します。

初めて正しい資格情報を使用してFTPサーバーにファイルをアップロードしようとしたときに、2回目の間違った資格情報(ユーザー名は同じだが間違ったパスワード)が発生した場合、例外はスローされず、ファイルは依然としてFTPサーバーにアップロードされました。次のコードを考えてみてください:

using System; 
using System.Net; 

internal class Program 
{ 
    private static void Main(string[] args) 
    { 
     var uri = new Uri("ftp://ftp.dlptest.com/TestFile.txt"); 
     var method = WebRequestMethods.Ftp.UploadFile; 

     //Here I'm uploading the test file using correct credentials 
     var correctCredentials = 
      new NetworkCredential("[email protected]", "fwRhzAnR1vgig8s"); 
     DoFtpRequest(uri, correctCredentials, method); 

     //Here I'm uploading the test file using wrong credentials. 
     //I expect some exception to be thrown and the file not being 
     //uploaded to the server, neither is the case. 
     var wrongCredentials = 
      new NetworkCredential("[email protected]", "WRONG_PASWORD"); 
     DoFtpRequest(uri, wrongCredentials, method); 
    } 

    public static FtpWebResponse DoFtpRequest(
     Uri uri, NetworkCredential credentials, string method) 
    { 
     var request = (FtpWebRequest)WebRequest.Create(uri); 
     request.Credentials = credentials; 
     request.Method = method; 
     return (FtpWebResponse)request.GetResponse(); 
    } 
} 

ここで私は、私はここにあなたがこのコードをテストするために使用できるhttps://dlptest.com/ftp-test/を発見した公共ftpサーバftp://ftp.dlptest.com/を使用しています。

最初に、正しい資格情報を使用してファイルをアップロードしてから、同じユーザー名を使用してパスワードを変更して間違った資格情報を使用してファイルをアップロードしようとします。 ファイルはまだサーバーにアップロードされています。最初に間違った資格情報を使用しようとすると、例外がスローされ、すべてが期待通りに機能します。

あなたは何が起こっているのか分かりますか?これはフレームワークのバグですか?私が今作業しているプログラムに問題が生じるので、この問題に対処する私の選択肢は何ですか?

答えて

1

FtpWebRequestは、ボンネットの下の接続プールを使用します。 FTP multiple files in C# without reestablishing connectionを参照してください。

その接続プールへのキーは、ホスト名、ポート番号、ユーザー名、およびオプションの接続グループ名です。


2番目の要求は、最初の要求からの接続を再利用し、間違ったパスワードを使用することはありません。これは、これらの2つの要求が同じ接続プールを使用するのは、パスワードの違いだけで、キーの一部ではないためです。

要求をスワップすると、最初の要求は成功せず、接続は閉じられ、プールには入りません。 2番目のリクエストは新しい接続から開始し、パスワードを使用して失敗します。彼らは別の接続プールを使用するようにするさまざまな要求のためのユニークなFtpWebRequest.ConnectionGroupNameを使用

  • :あなたができる要求を単離するために


  • FtpWebRequest.KeepAliveを無効にすると、接続プーリングが完全に無効になります。
関連する問題