Iterazione su più gruppi di credenziali

-3

Sto facendo un incarico per il mio sito scolastico e sto cercando di trovare un modo migliore per risolvere il mio problema.

Quindi, ogni volta che viene eseguito un determinato metodo devo ricaricare cinque file diversi, in cinque diversi FTP. Ognuno di questi FTP richiede credenziali diverse, quindi per ogni upload devo creare un nuovo client con il corrispondente set di credenziali.

In questo momento, il mio codice sembra qualcosa del genere, che ritengo sia molto sporco (ma non sono sicuro di un modo migliore!):

public static string url;
public static string username;
public static string password;

public static void UploadFiles()
{
   for (var i = 0; i < 5; i++)
       GetCredentials(i)

   using (var client = new FtpClient(url, username, password))
   {
       // connect to client
       // and upload the file
       // using the parameters set in GetCredentials()
   }
}

private static void GetCredentials(int id)
{
    case 0:
        username = "user0"
        password = "pass0"
    case 1:
        username = "user1"
        password = "pass1"
    case 2:
        username = "user2"
        password = "pass2"
    case 3:
        username = "user3"
        password = "pass3"
    case 4:
        username = "user4"
        password = "pass4"
}

Funziona tutto bene e sto per metterlo in produzione, ma mi piacerebbe davvero imparare qualcosa da questo, invece di usare solo la prima soluzione che mi viene in mente. Qualsiasi consiglio è apprezzato!

    
posta Tauropi 12.01.2018 - 14:08
fonte

1 risposta

0

prova questo

public class Client
{
    public string username;
    public string password;
}

public void main(string[] args)
{
   List<Client> clients = new List<Client>()
   clients.Add(new Client() {username = "user1", password = "pass1"});
   clients.Add(new Client() {username = "user2", password = "pass2"});
   clients.Add(new Client() {username = "user3", password = "pass3"});
   ....
   //really you should load them from a file
   var url = "get this form the user?";
   UploadFiles(url, clients).Wait;
}

public async Task UploadFiles(string url, IEnumerable<Client> clients)
{
    List<Task> tasks = new List<Task>();
    foreach(var c in clients)
    {
        tasks.Add(ftpUpload(url,c));
    }
    await Task.WhenAll(tasks);
}

public async Task ftpUpload(string url, Client client)
{
    using (var ftpClient = new FtpClient(url, c.username, c.password))
    {
       // connect to client
       // and upload the file 
       await ftpClient.UploadAsync(file);
    }
}

Spiegazione:

Devi evitare le variabili globali. Il tuo esempio è molto semplice ma, potenzialmente, se GetCredentials viene chiamato da un altro thread mentre sei nel tuo ciclo di upload, verranno utilizzati username e password sbagliati.

In secondo luogo, poiché il caricamento ftp non richiede calcoli, è logico farlo in modo asincrono. Sebbene, ciò potrebbe dipendere dalla larghezza di banda della tua rete

    
risposta data 12.01.2018 - 17:51
fonte

Leggi altre domande sui tag