2011-01-15 16 views
16

Gracias icktoofay, Intenté usar HttpWebRequest y HttpWebResponse.Cómo descargar el archivo usando la clase HttpWebRequest y HttpWebResponse (Cookies, Credenciales, etc.)

Cuando solicito URL pasando las credenciales como nombre de usuario y contraseña.

Volveré a obtener la ID de la sesión en la respuesta.

Después de obtener esa ID de sesión, Cómo seguir adelante.

El usuario autenticado se rastrea usando credenciales/cookies. Tengo la URL exacta del archivo para descargar y las credenciales. Si quiere usar Cookies lo haré. Necesito leer los datos del archivo y escribirlos/guardarlos en una ubicación especificada.

El código que estoy usando es;

string username = ""; 
string password = ""; 
string reqString = "https://xxxx.com?FileNAme=asfhasf.mro" + "?" + 
      "username=" + username + &password=" + password; 
byte[] requestData = Encoding.UTF8.GetBytes(reqString); 
string s1; 
CookieContainer cc = new CookieContainer(); 

var request = (HttpWebRequest)WebRequest.Create(loginUri); 
request.Proxy = null; 
request.CookieContainer = cc; 
request.Method = "POST"; 
HttpWebResponse ws = (HttpWebResponse)request.GetResponse(); 
Stream str = ws.GetResponseStream(); 
//ws.Cookies 
//var request1 = (HttpWebRequest)WebRequest.Create(loginUri); 
byte[] inBuf = new byte[100000]; 
int bytesToRead = (int) inBuf.Length; 
int bytesRead = 0; 
while (bytesToRead > 0) 
{ 
    int n = str.Read(inBuf, bytesRead,bytesToRead); 
    if (n==0) 
    break; 
    bytesRead += n; 
    bytesToRead -= n; 
} 
FileStream fstr = new FileStream("weather.jpg", FileMode.OpenOrCreate, 
            FileAccess.Write); 
fstr.Write(inBuf, 0, bytesRead); 
str.Close(); 
fstr.Close(); 

Respuesta

20

Esto es cómo lo hago:

const string baseurl = "http://www.some......thing.com/"; 
CookieContainer cookie; 

El método primeros inicios de sesión en el servidor web y obtiene del ID de sesión:

public Method1(string user, string password) { 
    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(baseurl); 

    req.Method = "POST"; 
    req.ContentType = "application/x-www-form-urlencoded"; 
    string login = string.Format("go=&Fuser={0}&Fpass={1}", user, password); 
    byte[] postbuf = Encoding.ASCII.GetBytes(login); 
    req.ContentLength = postbuf.Length; 
    Stream rs = req.GetRequestStream(); 
    rs.Write(postbuf,0,postbuf.Length); 
    rs.Close(); 

    cookie = req.CookieContainer = new CookieContainer(); 

    WebResponse resp = req.GetResponse(); 
    resp.Close(); 
} 

El otro método obtiene el archivo desde el servidor:

string GetPage(string path) { 
    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(path); 
    req.CookieContainer = cookie; 
    WebResponse resp = req.GetResponse(); 
    string t = new StreamReader(resp.GetResponseStream(), Encoding.Default).ReadToEnd(); 
    return IsoToWin1250(t); 
} 

Tenga en cuenta que vuelvo t él pagina como cadena Probablemente sea mejor devolverlo como bytes [] para guardar en el disco. Si sus archivos jpeg son pequeños (generalmente no tienen un tamaño de gigabyte), puede simplemente ponerlos en la secuencia de la memoria y luego guardarlos en el disco. Tomará unas 2 o 3 líneas simples en C#, y no 30 líneas de código difícil con posibles pérdidas de memoria peligrosas como las indicadas anteriormente.

+0

Gracias Ales, sí, probé el primer método y obtuve la cookie como ID de sesión y cuando asigno esa colección de cookies a la nueva solicitud web e intento de solicitar URL del archivo iehttps: //ghasghfh/filename=hasfhgfhg.mro . Cuando intento obtener la respuesta en el formulario de cadena. Los valores de cadena que obtengo son el código HTML/ViewSource de la página de inicio de sesión. Por favor, respóndeme. Realmente aprecio tu ayuda. – Vinay

+0

Significa que realizó una descarga exitosa de la página web, pero no ha ingresado correctamente el nombre de usuario y la contraseña. Mi ejemplo (vea la línea con el comando string.Format) usa un formato de POST, que vi en el servidor con php donde quería usar mi código. Comencé con el complemento de Firefox que muestra todas las comunicaciones con el servidor, y luego hice lo mismo en mi código. Y funciona. –

+0

Al Kepp, U derecho, puedo descargar el HTML del archivo con éxito. cualquier sugerencia donde el problema/problema persiste. ¿Hay algún cuidado extra que tomar? – Vinay

Cuestiones relacionadas