webrequestmethods net example conectar c# .net ftp uri

net - uri c# example



¿Alternativa a la implementación URI de.NET? (4)

Bueno, el problema no es que no puedo crear una conexión FTP, sino que los URI no se analizan según RFC 2396.

Lo que en realidad quería hacer era crear una fábrica que proporcionara implementaciones de una interfaz de transferencia de archivos genérica (que contiene métodos get y put), basada en un URI de conexión determinado. El URI define el protocolo, la información del usuario, el host y la ruta, y las propiedades que deben pasarse deben pasarse a través de la parte de consulta del URI (como la opción del modo pasivo para la conexión FTP).

Sin embargo, esto resultó difícil utilizando la implementación .RI de URI, ya que parece analizar la parte de consulta de URI de forma diferente en función del esquema.

Así que esperaba que alguien supiera una solución alternativa a esto, o una alternativa a la implementación .NET URI aparentemente rota. Sería bueno saberlo antes de pasar horas implementando el mío.

Tengo un problema con la implementación URI de .NET. Parece que si el esquema es "ftp", la parte de la consulta no se analiza como una consulta, sino como parte de la ruta en su lugar.

Tome el siguiente código, por ejemplo:

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"

Me parece que la clase Uri analiza erróneamente la parte de la consulta como parte de la ruta. Sin embargo, cambiando el esquema a http, el resultado es el esperado:

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

¿Alguien tiene una solución para esto, o sabe de una clase URI alternativa que funciona como se esperaba?


Debe usar las clases FtpWebRequest y FtpWebResponse a menos que tenga una razón específica para no hacerlo.

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

Ref1 Ref2


He estado luchando con el mismo problema por un tiempo. Intentando reemplazar el UriParser existente por el esquema "ftp" usando UriParser.Register lanza una InvalidOperationException porque el esquema ya está registrado.

La solución que he propuesto implica el uso de la reflexión para modificar el analizador de ftp existente para que permita la cadena de consulta. Esto se basa en una solución a otro error de UriParser .

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

Ejecuta eso en algún lugar de tu inicialización, y tu ftp Uris tendrá la cadena de consulta en el parámetro Query , como es de esperar, en lugar de Path .


Tienes que usar una clase específica para el protocolo FTP como FtpWebRequest que tiene una propiedad Uri como RequestUri.

Deberías buscar en esas clases para un analizador de Uri, creo.