Utilizzo di flussi sulla rete

Le risorse di rete sono rappresentate in .NET Framework da flussi (stream). Grazie a una gestione generica dei flussi, in .NET Framework sono disponibili le seguenti funzionalità:

  • Un metodo semplice per l'invio e la ricezione di dati Web. Indipendentemente dall'effettivo contenuto del file (HTML, XML o altro), per l'invio e la ricezione dei dati verranno utilizzati Stream.Write e Stream.Read.
  • Compatibilità con i flussi di .NET Framework. I flussi sono utilizzati nell'intero contesto di .NET Framework, che dispone di un'elaborata infrastruttura per gestirli. È ad esempio possibile modificare un'applicazione che legge dati XML da un flusso FileStream perché legga invece dati da un flusso NetworkStream modificando unicamente le poche righe di codice relative all'inizializzazione del flusso. Tra le principali differenze tra la classe NetworkStream e gli altri flussi vi sono le seguenti: NetworkStream non supporta operazioni di ricerca, la proprietà CanSeek restituisce sempre false e i metodi Seek e Position generano un'eccezione NotSupportedException.
  • Elaborazione dei dati man mano che giungono. I flussi consentono di accedere ai dati appena pervengono da Internet, senza costringere l'applicazione ad attendere che venga completato lo scaricamento di un intero set di dati.

Nello spazio dei nomi System.Net.Sockets è inclusa una classe NetworkStream che consente di implementare la classe Stream per l'utilizzo con Internet. Nelle classi dello spazio dei nomi System.Net.Sockets viene utilizzata la classe NetworkStream per rappresentare i flussi.

Per inviare dati alla rete utilizzando il flusso restituito, chiamare GetRequestStream sulla classe WebRequest. Verranno inviate intestazioni di richiesta al server e in seguito sarà possibile inviare dati alla risorsa Internet chiamando il metodo BeginWrite, EndWrite o Write sul flusso restituito. Con alcuni protocolli, quale HTTP, per poter inviare i dati può essere necessario impostare proprietà specifiche del protocollo. Nell'esempio di codice che segue si illustra come impostare proprietà specifiche del protocollo HTTP per l'invio di dati. Nell'esempio si presuppone che la variabile sendData contenga i dati da inviare e che la variabile sendLength corrisponda al numero dei byte di dati da inviare.

HttpWebRequest request = 
   (HttpWebRequest) WebRequest.Create("http://www.contoso.com/");
request.Method = "POST";
request.ContentLength = sendLength;
try
{
   Stream sendStream = request.GetRequestStream();
   sendStream.Write(sendData,0,sendLength);
   sendStream.Close();
}
catch
{
   // Handle errors . . .
}
[Visual Basic]
Dim request As HttpWebRequest = _
   CType(WebRequest.Create("http://www.contoso.com/"), HttpWebRequest)
request.Method = "POST"
request.ContentLength = sendLength
Try
   Dim sendStream As Stream = request.GetRequestStream()
   sendStream.Write(sendData, 0, sendLength)
   sendStream.Close()
Catch
   ' Handle errors . . .
End Try

Per ricevere dati dalla rete, chiamare GetResponseStream sulla classe WebResponse. Sarà quindi possibile leggere dati dalla risorsa Internet chiamando il metodo BeginRead, EndRead o Read sul flusso restituito.

Quando si utilizzano flussi provenienti da risorse di rete, si tenga presente quanto segue:

  • La proprietà CanSeek restituisce sempre false perché la classe NetworkStream non può cambiare posizione nel flusso. Con i metodi Seek e Position viene generata un'eccezione NotSupportedException.
  • Quando si utilizzano WebRequest e WebResponse, le istanze di flusso create chiamando GetResponseStream sono di sola lettura, mentre le istanze di flusso create chiamando GetRequestStream sono di sola scrittura.
  • Utilizzare la classe StreamReader per facilitare la codifica. Nell'esempio di codice che segue si utilizza StreamReader per leggere un flusso codificato ASCII da una classe WebResponse. Nell'esempio non è riportata la creazione della richiesta.
  • La chiamata a GetResponse può bloccarsi se non sono disponibili risorse di rete. Si consiglia di considerare l'utilizzo di una richiesta asincrona con i metodi BeginGetResponse e EndGetResponse.
  • La chiamata a GetRequestStream può bloccarsi mentre viene stabilita la connessione al server. Si consiglia di considerare l'utilizzo di una richiesta asincrona per il flusso con i metodi BeginGetRequestStream e EndGetRequestStream.
// Create a response object.
WebResponse response = request.GetResponse();
// Get a readable stream from the server.
StreamReader sr = 
   new StreamReader(response.GetResponseStream(), Encoding.ASCII);
// Use the stream. Remember when you are through with the stream to close it.
sr.Close();
[Visual Basic]
' Create a response object.
Dim response As WebResponse = request.GetResponse()
' Get a readable stream from the server.
Dim sr As _ 
   New StreamReader(response.GetResponseStream(), Encoding.ASCII)
' Use the stream. Remember when you are through with the stream to close it.
sr.Close()

Vedere anche

Utilizzo delle classi di richiesta e risposta Internet | Invio di richieste di dati