Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116

    leggere dei dati da remoto

    In un server remoto B ho una pagina aspx che, richiamata con metodo POST, restituisce un file binario, tipicamente un file .zip.

    Dal server A, una pagina aspx deve invocare quella pagina del server B, spedendo parametri via POST, e deve ottenere un vettore di byte.

    Mi potreste dare una mano?
    Pietro

  2. #2
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    piu o meno è questo

    occhio ai cast, bisogna farli perche altrimenti i metodi ritornano oggetti delle classi base HttpRequest e HttResponse e non del tipo derivato HttpWebRequet...

    codice:
    //i dati post hanno lo stesso formato di una querystring ma vanno codificati in ascii in un array di byte
    byte[]  post = new ASCIIEncoding().GetBytes("dato1="+dato1+"&dato2="+dato2);
    //crei l'oggetto per effettuare la request
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.serverB.com/pagina.aspx");
    //imposti l'head della richiesta, questi tre sono obbligatori
    request.Method = "POST";
    request.ContentType = "application/x-www-form-urlencoded";
    request.ContentLength = post.Length;
    
    //scrivi i dati nello stream della richiesta, è in questo momento che vengono inviati
    using (Stream requestStream = request.GetRequestStream())
    {
      requestStream.Write(post,0,post.Length);
    }
    
    //leggi la risposta
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    using (Stream responseStream = response.GetResponseStream())
    {
      //responseStream contiene l'array di byte del file zip.
    }

  3. #3
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Ti ringrazio. Naturalmente debbo studiarmelo bene, ma ho una domanda da farti.

    Ho delle vecchie procedure che, come hai suggerito te, codificano i dati post in un vettore ASCII

    Dim bytes As Byte() = Encoding.ASCII.GetBytes(datiInviati)


    adesso, io ho la necessità di passare un elenco di files in questo formato:

    files=nome1.txt,nome2.txt,..., nomeN.txt

    per collaudo ho creato alcuni files con nomi "strani" tipo:

    à.txt, a b.txt, a&b.txt, a'b.txt, a"b.txt

    la stringa da inviare via post l'ho collaudata così:
    codice:
    Dim fs As String() = Directory.GetFiles("C:\dati\test\tmp", "*.txt")
    For i As Integer = 0 To fs.Length - 1
    	fs(i) = Server.UrlEncode(fs(i))
    Next
    Dim datiInviati As String = "files=" & String.Join(","c, fs)
    ho notato questo: se codifico con UrlEncode posso usare
    Dim bytes As Byte() = Encoding.ASCII.GetBytes(datiInviati)

    altrimenti va in errore e debbo correggere con
    Dim bytes As Byte() = Encoding.UTF8.GetBytes(datiInviati)

    perciò la domanda è se sia necessaria una codifica ascii o no.

    ciao
    Pietro

  4. #4
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    mmm... Secondo me la doppia codifica (prima url poi ascii) non va bene. Utf8 al posto di ascii invece secondo me dovrebbe andare bene lo stesso. Per una verifica bisogna provare.

  5. #5
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Originariamente inviato da rsdpzed
    mmm... Secondo me la doppia codifica (prima url poi ascii) non va bene. Utf8 al posto di ascii invece secondo me dovrebbe andare bene lo stesso. Per una verifica bisogna provare.
    lascio ascii

    ciao
    Pietro

  6. #6
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    il codice che hai postato nel penultimo post va bene. nella fretta ho inteso che facessi l'urlencode su tutta la stringa a monte e non separatamente path per path.

    in alternativa anche utf8 va bene, l'importante è metterlo nell'head della request.

  7. #7
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Ti ringrazio

    In effetti ho il codice per fare la richiesta via post, ma ottengo come risposta una stringa.

    A me servirebbe che restituisse un vettore di byte, insomma, quello che manca sotto il commento
    //responseStream contiene l'array di byte del file zip.

    Pietro

  8. #8
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    cosi leggi il contenuto di uno stream in un array di byte

    codice:
                byte[] vb = new byte[stream.Length];
                stream.Read(vb, 0, (int)stream.Length);

  9. #9
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Originariamente inviato da rsdpzed
    cosi leggi il contenuto di uno stream in un array di byte

    codice:
                byte[] vb = new byte[stream.Length];
                stream.Read(vb, 0, (int)stream.Length);

    Domani provo (qui non ho il codice).

    Però mi pare di ricordare (ma forse sbaglio) di avere provato. Ma dava errore perché non riuscivo a leggere la proprietà Length dello stream.

    Grazie ancora
    Pietro

  10. #10
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    di nulla

    in debug leggi lo status code (e tutto il resto) della variabile webresponse magari c'è traccia di qualche problema nel server che non manda proprio il file per qualche motivo

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.