Domanda

Ho un problema con l'attuazione Uri del .NET. Sembra che se il regime è "ftp", la parte query non viene analizzato come una query, ma come una parte del percorso, invece.

Prendere il seguente codice, ad esempio:

Uri testuri = new Uri("ftp://user:pass@localhost/?passive=true");
Console.WriteLine(testuri.Query); // Outputs an empty string
Console.WriteLine(testuri.AbsolutePath); // Outputs "/%3Fpassive=true"

Mi sembra che la classe Uri analizza ingiustamente la parte query come parte del percorso. Tuttavia cambiando lo schema a http, il risultato è come previsto:

Uri testuri = new Uri("http://user:pass@localhost/?passive=true");
Console.WriteLine(testuri.Query); // Outputs "?passive=true"
Console.WriteLine(testuri.AbsolutePath); // Outputs "/"

Qualcuno ha una soluzione a questo, o sapere di una classe Uri alternativa che funziona come previsto?

È stato utile?

Soluzione

Bene, il problema non è che io sono in grado di creare una connessione FTP, ma questo URI non vengono analizzati accoding a RFC 2396.

Quello che realmente intenzione di fare era quello di creare una fabbrica che fornisce implementazioni di un'interfaccia di trasferimento file generico (contenenti ottenere e mettere metodi), sulla base di una data connessione URI. L'URI definisce il protocollo, informazioni utente, host e percorso e delle proprietà richieste da trasmettere deve essere fatto passare attraverso la parte query del URI (come l'opzione modalità passiva per la connessione FTP).

Tuttavia questo si è rivelato difficile usando l'implementazione .NET Uri, perché sembra di analizzare la parte di query di URI in modo diverso in base allo schema.

Quindi speravo che qualcuno sapeva una soluzione a questo, o di un'alternativa alla realizzazione apparentemente rotto .NET Uri. Sarebbe bello sapere prima di spendere ore attuare la mia.

Altri suggerimenti

Si dovrebbe usare la FtpWebRequest e < a href = "http://msdn.microsoft.com/en-us/library/system.net.ftpwebresponse.aspx" rel = "nofollow noreferrer"> FtpWebResponse classi meno che non abbiate un motivo specifico di non farlo.

FtpWebRequest.fwr = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://uri"));
fwr.ftpRequest.Method = WebRequestMethods.Ftp.UploadFile;
fwr.ftpRequest.Credentials = new NetworkCredential("user", "pass");


FileInfo ff = new FileInfo("localpath");
byte[] fileContents = new byte[ff.Length];

using (FileStream fr = ff.OpenRead())
{
   fr.Read(fileContents, 0, Convert.ToInt32(ff.Length));
}

using (Stream writer = fwr.GetRequestStream())
{
   writer.Write(fileContents, 0, fileContents.Length);
}

FtpWebResponse frp = (FtpWebResponse)fwr.GetResponse();
Response.Write(frp.ftpResponse.StatusDescription); 

Rif1 Rif2

Ho lottato con lo stesso problema per un po '. Il tentativo di sostituire l'UriParser esistente per il regime "ftp" utilizzando UriParser.Register genera InvalidOperationException perché lo schema è già stato registrato.

La soluzione che ho escogitato comporta l'uso di riflessione per modificare il parser ftp esistente in modo da consentire la stringa di query. Questo si basa su una soluzione per un'altra UriParser bug .

MethodInfo getSyntax = typeof(UriParser).GetMethod("GetSyntax", System.Reflection.BindingFlags.Static
                                                              | System.Reflection.BindingFlags.NonPublic);
FieldInfo flagsField = typeof(UriParser).GetField("m_Flags", System.Reflection.BindingFlags.Instance
                                                           | System.Reflection.BindingFlags.NonPublic);
if (getSyntax != null && flagsField != null)
{
    UriParser parser = (UriParser)getSyntax.Invoke(null, new object[] { "ftp"});
    if (parser != null)
    {
        int flagsValue = (int)flagsField.GetValue(parser);

        // Set the MayHaveQuery attribute
        int MayHaveQuery = 0x20;
        if ((flagsValue & MayHaveQuery) == 0) flagsField.SetValue(parser, flagsValue | MayHaveQuery);
    }
}

Run che da qualche parte nel vostro inizializzazione, e le tue Uris ftp avranno la stringa di query andare nel parametro Query, come ci si aspetterebbe, invece di Path.

È necessario utilizzare una classe specifica per il protocollo FTP come FtpWebRequest che ha una proprietà Uri come RequestUri.

Si dovrebbe cercare in thoses classi per un parser Uri credo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top