Como faço para baixar uma página da web em um córrego em .NET
Pergunta
Eu sei que isso deve ser uma questão básica, mas eu estou batendo uma parede de tijolos. Eu estou olhando para ir a um URL / URI baixar a cadeia resultante como se eu tivesse aberto um arquivo e, em seguida, tirá-lo em uma variável de cadeia.
Eu tenho encher aproximadamente com IO.Stream e Net.httpxxx, mas não conseguiram obter os elementos para alinhar no caminho certo.
Eu recebo "o formato do caminho fornecido não é suportado" de abrir a página no fluxo normal, porque não é no sistema de arquivos local ... que pouco eu entendo, o pouco que eu não entendo é ... como faço para conseguir o equivelent de:
Public Function GetWebPageAsString(pURL As String) As String
Dim lStream As IO.StreamReader = New System.IO.StreamReader(pURL)
Return lStream.ReadToEnd
End Function
Solução
A resposta curta, em C #, parece que
using(System.Net.WebClient client = new System.Net.WebClient())
{
string html = client.DownloadString("http://www.google.com");
}
Outras dicas
WebClient.OpenRead () pode ser o que você está procurando.
Amostra na página MSDN ligada acima:
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()
Esta função transfere qualquer URI para um arquivo. Você poderia facilmente adaptá-lo para colocá-lo em uma var string:
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;
}