2013-06-14 13 views
5

c'è un tutorial che in realtà lavora per la piattaforma Windows 8 con XAML e C#: http://www.tech-recipes.com/rx/1954/get_web_page_contents_in_code_with_csharp/Windows 8 C# - recuperare una fonte pagina web come stringa

Ecco come:

HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(URL); 
myRequest.Method = "GET"; 
WebResponse myResponse = myRequest.GetResponse(); 
StreamReader sr = new StreamReader(myResponse.GetResponseStream(), System.Text.Encoding.UTF8); 
string result = sr.ReadToEnd(); 
sr.Close(); 
myResponse.Close(); 

Tuttavia in Windows 8, l'ultima 2 linee che sono codice per chiudere la connessione (presumo), errore rilevato. Funziona bene senza chiudere la connessione, però, ma quali sono le probabilità? Perché dobbiamo chiudere la connessione? Cosa potrebbe andare storto se non lo faccio? Cosa significa "chiusura della connessione"?

+0

Quali errori si ottengono? – ZorleQ

+0

non è un errore di runtime, c'è un errore quando lo modifico: 'System.IO.SystemReader' non contiene una definizione per 'Chiudi' e nessun metodo di estensione 'Chiudi' blablabla –

+0

Quale versione di .NET hai installato ? Potrebbe non essere Windows 8, ma potrebbe essere la versione .NET. – webnoob

risposta

3

Se stai sviluppando per Windows 8, dovresti considerare l'utilizzo di metodi asincroni per fornire un'esperienza utente migliore ed è consigliabile raccomandare un nuovo standard. Il tuo codice sarebbe quindi simile:

public async Task<string> MakeWebRequest(string url) 
{ 
    HttpClient http = new System.Net.Http.HttpClient(); 
    HttpResponseMessage response = await http.GetAsync(url); 
    return await response.Content.ReadAsStringAsync(); 
} 
+0

Semplice ed efficiente. Grazie. –

0

Forse hanno deprecato close() nell'ultima API. Questo dovrebbe funzionare:

HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(URL); 
myRequest.Method = "GET"; 

using(WebResponse myResponse = myRequest.GetResponse()) 
{ 
    using(StreamReader sr = new StreamReader(myResponse.GetResponseStream(), System.Text.Encoding.UTF8)) 
    { 
     string result = sr.ReadToEnd(); 
    } 
} 

Il comando using disporrà automaticamente gli oggetti.

Per evidenziare il commento di webnoob:

solo far notare (per riferimento OP) è possibile utilizzare solo l'utilizzo su classi che implementano IDisposable (che in questo caso va bene)

+0

Solo per indicare (per riferimento OP) è possibile utilizzare solo 'using' su classi che implementano IDisposable (che in questo caso va bene). – webnoob

+0

assolutamente corretto. – ZorleQ

0
using System.Net; 
using System.Net.Http; 

var httpClient = new HttpClient(); 
var message = new HttpRequestMessage(HttpMethod.Get, targetURL); 
//message.Headers.Add(....); 
//message.Headers.Add(....); 

var response = await httpClient.SendAsync(message); 
if (response.StatusCode == HttpStatusCode.OK) 
{ 
    //HTTP 200 OK 
    var requestResultString = await response.Content.ReadAsStringAsync(); 
} 
Problemi correlati