FtpWebRequest игнорирует неверный пароль после предыдущего успешного соединения с использованием правильного пароля
Я столкнулся с проблемой при работе с классом FtpWebRequest
в C#.
Когда я пытаюсь загрузить файл на FTP-сервер, используя правильные учетные данные в первый раз, а затем неправильные учетные данные (имя пользователя то же самое, но неправильный пароль) во второй раз, не возникает никаких исключений, и файл по-прежнему загружается на 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("dlpuser@dlptest.com", "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("dlpuser@dlptest.com", "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();
}
}
Здесь я использую общедоступный ftp-сервер ftp://ftp.dlptest.com/
, который я нашел здесь https://dlptest.com/ftp-test/ который вы можете использовать для тестирования этого кода.
Вы знаете, что происходит? Это ошибка фреймворка? Каковы мои варианты решения этой проблемы, потому что она вызывает проблемы с программа, над которой я сейчас работаю?
1 ответ:
FtpWebRequest
использует пул соединений под капотом. Смотрите FTP несколько файлов в C# без восстановления соединения.Ключами к этому пулу соединений являются только имя хоста, номер порта, имя пользователя и необязательное имя группы соединений.
Ваш второй запрос повторно использует соединение из первого запроса и никогда не использует неверный пароль. Это потому, что эти два запроса используют один и тот же пул соединений, так как они отличаются только паролем, который не является частью ключ.
В то время как при замене запросов первый запрос не выполняется, его соединение закрывается и не попадает в пул. Второй запрос должен начинаться с нового соединения, будет использовать его пароль и завершится неудачей.
Чтобы изолировать запросы, вы можете:
- используйте уникальный
FtpWebRequest.ConnectionGroupName
для разных запросов, чтобы заставить их использовать разные пулы соединений.- или отключить
FtpWebRequest.KeepAlive
для полного отключения пула соединений.