Foros del Web

Foros del Web (http://www.forosdelweb.com/)
-   .NET (http://www.forosdelweb.com/f29/)
-   -   Enviar archivos usando HTTPWebRequest Post desde WinForms (http://www.forosdelweb.com/f29/enviar-archivos-usando-httpwebrequest-post-desde-winforms-484886/)

jjmagro 25/04/2007 16:18

Enviar archivos usando HTTPWebRequest Post desde WinForms
 
Buenas gente, estoy con un problema que necesito a ver si alguien puede iluminarme y ayudarme a solucionarlo...

Estoy desarrollando una aplicación Windows que encripta archivos con OpenGP y luego los envía a una página .PHP que está en un servidor HTTPS.

El problema salta porque no solamente mando archivos, tengo que mandar un total de 15 parámetros: 7 archivos y 8 cadenas de texto.
Lamentablemente no tengo acceso a la aplicación .php y tengo que estar llamando constantemente a cada rato a la empresa que la administra para que me digan qué respondió o que devolvió, y en todos los casos me dicen que la información llega bien... menos los archivos...
Es decir, que los 8 parámetros correspondientes a las diferentes cadenas de texto sí llegan, pero los otros 7 parámetros en donde se supone que tienen que llegar los archivos *.gpg pues no llegan :'(

En definitiva, mi problema son dos:
1) Conocen algún sniffer o programa que me permita ver la respuesta del servidor HTTPS para no andar llamando a cada rato a la empresa? (ya los tengo fastidiados seguramente) :neurotico

2) Alguien puede darme un ejemplo de cómo postear los parámetros para que, los archivos vayan como archivos y las cadenas de texto vayan como cadenas de texto? imagino que tengo que manipular el "contentType" y esas cosas...

Para quienes puedan ayudarme, les adjunto el código y lo explico un poco:

Código:

private void button2_Click(object sender, System.EventArgs e)
{
//1) Implemento una interfaz sobreescrita de CertificatePolicy para no tener
//    problemas con rechazos de certificados del SSL

System.Net.ServicePointManager.CertificatePolicy = new MyPolicy();
               
//2) Obtengo el directorio de donde voy a sacar los archivos
DirectoryInfo di = new DirectoryInfo(@"c:\convolgpg");
FileInfo[] rgFiles = di.GetFiles("*.gpg");

//3) Defino la dirección a donde voy a postearstring gatewayUrl = "https://sitio.com/paginita.php";

//4) Creo una instancia del objeto HttpWebResponseHttpWebResponse resp = null;
try
{

//5) Instancio una variable de cadena en donde voy a ir guardando los
//    resultados que voy a terminar posteando

string postData = "&clave=8f247c34e9"; //Le asigno el primer parametro

//6) Me fijo en todos los archivos dentro de la carpeta
//    que instancié más arriba

foreach(FileInfo fi in rgFiles)
{
//7) Los parámetros que me piden son:
//    Por cada archivo que envío, debo mandar un parámetro adicional
//    que es el checksum del archivo utilizando SHA1
//    Los parametros que me piden son los siguientes:
//    alarmadispensario ===> es uno de los archivos que tengo que mandar
//    alarmadispensario_checksum ===> el resultado del SHA1
//    lo mismo para los otros archivos. Aqui en el código solo pongo tres de los
//    7 archivos porque sino se me hace enorme el código

string identificador = fi.Name.Substring(16,3); //Para identificar qué archivo
switch(identificador)
{
case "ADI":
string alarmadispensario;
using (StreamReader lector = new StreamReader(@"c:\convolgpg\" + fi.Name))
        {
        alarmadispensario = lector.ReadToEnd();
        }
FileStream f = new FileStream(@"c:\convolgpg\" + fi.Name,FileMode.Open,FileAccess.Read,FileShare.Read, 8192);
SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider();
StringBuilder sb = new StringBuilder();
foreach(byte b in sha1.ComputeHash(f))
{
sb.Append(b.ToString("x2").ToLower());
}
string alarmadispensarioCS = "&alarmadispensario_checksum=" + sb.ToString();

//8) Al string postData le agrego los dos nuevos parámetrospostData += "&alarmadispensario=" + alarmadispensario;
postData += alarmadispensarioCS;
break;
case "ATQ":
string alarmatanque;
using (StreamReader lector = new StreamReader(@"c:\convolgpg\" + fi.Name))
{
alarmatanque = lector.ReadToEnd();
}
f = new FileStream(@"c:\convolgpg\" + fi.Name,FileMode.Open,FileAccess.Read,FileShare.Read, 8192);
sha1 = new SHA1CryptoServiceProvider();
sb = new StringBuilder();
foreach(byte b in sha1.ComputeHash(f))
{
sb.Append(b.ToString("x2").ToLower());
}
string alarmatanqueCS = "&alarmatanque_checksum=" + sb.ToString();

//9) Y le agrego los otros dos nuevos parámetros...postData += "&alarmatanque=" + alarmatanque;
postData += alarmatanqueCS;
break;
case "VTA":
string ventas;
using (StreamReader lector = new StreamReader(@"c:\convolgpg\" + fi.Name))
{
ventas = lector.ReadToEnd();
}
f = new FileStream(@"c:\convolgpg\" + fi.Name,FileMode.Open,FileAccess.Read,FileShare.Read, 8192);
sha1 = new SHA1CryptoServiceProvider();
sb = new StringBuilder();
foreach(byte b in sha1.ComputeHash(f))
{
sb.Append(b.ToString("x2").ToLower());
}
string ventasCS = "&ventas_checksum=" + sb.ToString();

//10) Y por último los últimos dos
//    (en total se supone que tengo 7 parámetros)

postData += "&ventas=" + ventas;
postData += ventasCS;
break;
}
}

//11) Genero una nueva instancia para presentar mis credenciales al sitioCredentialCache myCred = new CredentialCache();
myCred.Add(new Uri("https://sitio.com"),"BASIC",new NetworkCredential("usuario","password"));

//12) Genero una nueva instancia del objeto HttpWebRequestHttpWebRequest  request = (HttpWebRequest)WebRequest.Create(gatewayUrl);

//13) Le asigno las credenciales que hicerequest.Credentials = myCred;

//14) Le indico el User Agentrequest.UserAgent ="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";

//15) En un arreglo de bytes byte[]  postDataBytes = Encoding.UTF8.GetBytes(postData);

//16) El resto supongo que no hace falta que lo explique:request.Method = "POST";
request.ContentType = "automatic/name";
request.ContentLength = postDataBytes.Length;
Stream requestStream = request.GetRequestStream();
requestStream.Write(postDataBytes, 0 ,postDataBytes.Length);

resp = (HttpWebResponse)request.GetResponse();

StreamReader responseReader =  new StreamReader(resp.GetResponseStream(), Encoding.UTF8);

resp.Close();
requestStream.Close();
}
catch()
{
}
finally
{
if ( resp != null )
{
resp.Close();
}
}               
}


Que estoy haciendo mal??????
Que me falta por ordenar / arreglar / quitar?????
Por favor ayúdenme :'(

Makoynet 07/03/2008 18:54

Re: Enviar archivos usando HTTPWebRequest Post desde WinForms
 
hola que tal , soy nuevo en el foro, tengo un problemita, y es que soy nuevo en C#, no havia tenido la necesidad de utilizarlo, y el primer problema que me surge es que no he podido hacer el metodo de encriptacion GPG, me seria de gran ayuda si me pudieras dar un ejemplo o cual metodo puedo utilizar para realizar la encriptacion.
de antemano gracias por la ayuda que me puedas brindar

Makoynet 10/03/2008 15:00

Re: Enviar archivos usando HTTPWebRequest Post desde WinForms
 
Revisa esto:
request.ContentType = "automatic/name";
Por eso no resives tu respuesta, porque no estas mandando los datos como se deben de mandar.
con esta es para enviar cadenas que es lo que te hace falta;
request.ContentType = "application/x-www-form-urlencoded";
y exixte otro metodo que es para enviar archivos;
httpWebRequest.ContentType = "multipart/form-data; boundary=" + boundary;

mira en esta pagina: http://developer.nirvanix.com/forums/p/56/126.aspx
Espero que te saque de la duda y me puedas ayudar con lo que solicito antes de este mensaje.

jmo25 02/02/2010 13:39

Respuesta: Enviar archivos usando HTTPWebRequest Post desde WinForms
 
Fijate en este link donde explico como hacerlo.
Esta en vb .net, si hago tiempo lo paso a C, pero es bastante transparente el traspaso.

[URL="http://www.forosdelweb.com/f29/post-vb-net-743175/#post3265260"]http://www.forosdelweb.com/f29/post-vb-net-743175/#post3265260[/URL]

Saludos

gnzsoloyo 02/02/2010 15:30

Respuesta: Enviar archivos usando HTTPWebRequest Post desde WinForms
 
jmo25: Trata de no despertar los muertos.
El post original es de hace tres años, y el forista no se ha conectado desde abril de 2007.
Francamente no creo que le interese más el tema o la respuesta.
Te comento que los moderadores tienen por regla cerrar los post viejos cuando alguien los resucita (es política de FDW).
Trata de fijate en las fechas del primer post para no desperdiciar tiempo: Si es muy vieja y el forista no tiene muchos mensajes (menos de 100), es muy probable que ya no ande por aquí.


La zona horaria es GMT -6. Ahora son las 20:56.

Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.