views:

330

answers:

3

I know this should be a basic question but I am hitting a brick wall. I am looking to go to a URL/URI download the resulting string as if I had opened a file and then get it out into a String variable.

I have been stuffing about with IO.Stream and Net.httpxxx but haven't managed to get the elements to line up in the right way.

I get "the given path's format is not supported" from opening the page in the standard stream, because it's not in the local file system ... that bit i understand, the bit I don't get is ... how do I achieve the equivelent of:

Public Function GetWebPageAsString(pURL As String) As String
        Dim lStream As IO.StreamReader = New System.IO.StreamReader(pURL)
        Return lStream.ReadToEnd

End Function
A: 

This function downloads any URI to a file. You could easily adapt it to put it into a string var:

public static int DownloadFile(String remoteFilename, String localFilename, bool enforceXmlSafe)
{
// Function will return the number of bytes processed
// to the caller. Initialize to 0 here.
int bytesProcessed = 0;

// Assign values to these objects here so that they can
// be referenced in the finally block
Stream remoteStream = null;
Stream localStream = null;
WebResponse response = null;   

// Use a try/catch/finally block as both the WebRequest and Stream
// classes throw exceptions upon error
try
{
 // Create a request for the specified remote file name
 WebRequest request = WebRequest.Create(remoteFilename);
 if (request != null)
 {
  // Send the request to the server and retrieve the
  // WebResponse object 
  response = request.GetResponse();
  if (response != null)
  {
   // Once the WebResponse object has been retrieved,
   // get the stream object associated with the response's data
   remoteStream = response.GetResponseStream();

   // Create the local file
   if (localFilename != null)
    localStream = File.Create(localFilename);
   else
    localStream = new MemoryStream();

   // Allocate a 1k buffer
   byte[] buffer = new byte[1024];
   int bytesRead;

   // Simple do/while loop to read from stream until
   // no bytes are returned
   do
   {
    // Read data (up to 1k) from the stream
    bytesRead = remoteStream.Read(buffer, 0, buffer.Length);

    // Write the data to the local file
    localStream.Write(buffer, 0, bytesRead);

    // Increment total bytes processed
    bytesProcessed += bytesRead;
   } while (bytesRead > 0);
  }
 }
}
catch (Exception e)
{
 Console.WriteLine(e.Message);
}
finally
{
 // Close the response and streams objects here 
 // to make sure they're closed even if an exception
 // is thrown at some point
 if (response != null) response.Close();
 if (remoteStream != null) remoteStream.Close();
 if (localStream != null) localStream.Close();
}

// Return total bytes processed to caller.
return bytesProcessed;
}
JerSchneid
+1  A: 

WebClient.OpenRead() might be what you're looking for.

Sample from the MSDN page linked above:

 Dim uriString as String
 uriString = "http://www.google.com"

 Dim myWebClient As New WebClient()

 Console.WriteLine("Accessing {0} ...", uriString)

 Dim myStream As Stream = myWebClient.OpenRead(uriString)

 Console.WriteLine(ControlChars.Cr + "Displaying Data :" + ControlChars.Cr)
 Dim sr As New StreamReader(myStream)
 Console.WriteLine(sr.ReadToEnd())

 myStream.Close()
M4N
Thanks, but I get The given path's format is not supported On Dim myStream As Stream = myWebClient.OpenRead(uriString) linefor webpage http://www.alllotto.com/Arizona-Pick-3-May-2009-Lottery-Results.phpIs it an issue with the web page or ???
Rob
Same with this very page http://stackoverflow.com/questions/929808/how-do-i-download-a-webpage-into-a-stream-in-netgives the same error, which is the one I have been striking all night.
Rob
When I run the above sample with the URL of this question or with "http://www.google.com", then it works as expected. Can you add your complete code to the question?
M4N
I have updated the code with a sample URL. This works for me.
M4N
+4  A: 

The short answer, in C#, looks like

using(System.Net.WebClient client = new System.Net.WebClient())
{
  string html = client.DownloadString("http://www.google.com");
}
Henk Holterman
But this doesn't give you a Stream, as the OP asked for.
M4N
@Martin: It includes a solution for the "and then get it out into a String variable" part
Henk Holterman
Strictly no it was what I asked for, but it was what I wanted :)
Rob