2013-11-26 12 views
6

W C# Windows Forms można uzyskać zawartość strony internetowej przy użyciu:Get zawartość strony internetowej i kod stanu HTTP w C#

string content = webClient.DownloadString(url); 

I mogę dostać nagłówek HTTP przy użyciu:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
request.Method = "GET"; 
string response = ((HttpWebResponse)request.GetResponse()).StatusCode.ToString(); 

Czy istnieje sposób, aby uzyskać zarówno zawartość, jak i kod statusu HTTP (jeśli się nie powiedzie) podczas jednej podróży do serwera zamiast dwukrotnie?

Dzięki.

+0

huh? używasz GET, więc dostajesz GET. gdzie jest pytanie? –

+1

'request.GetResponse()' otrzymuje obie. To ty bierzesz od niego tylko "StatusCode". – Tobberoth

Odpowiedz

5

można odczytać dane ze strumienia wewnątrz obiektu HttpWebResponse:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
request.Method = "GET"; 
using (var response = request.GetResponse()) 
using (var stream = response.GetResponseStream()) 
using (var reader = new StreamReader(stream)) 
{ 
    HttpStatusCode statusCode = ((HttpWebResponse)response).StatusCode; 
    string contents = reader.ReadToEnd(); 
} 

W ten sposób trzeba będzie wykryć kodowanie ręcznie lub przy użyciu biblioteki wykryć kodowanie. Kodowanie można również odczytać jako ciąg znaków z obiektu HttpWebResponse, jeśli taki istnieje, znajduje się wewnątrz właściwości ContentType. Jeśli strona jest w języku HTML, musisz przeanalizować ją pod kątem możliwej zmiany kodowania w górnej części dokumentu lub w głowie.

Czytaj obsługi kodowanie z nagłówka contenttype

var request = (HttpWebRequest)WebRequest.Create(url); 
request.Method = "GET"; 
string content; 
HttpStatusCode statusCode; 
using (var response = request.GetResponse()) 
using (var stream = response.GetResponseStream()) 
{ 
    var contentType = response.ContentType; 
    Encoding encoding = null; 
    if (contentType != null) 
    { 
     var match = Regex.Match(contentType, @"(?<=charset\=).*"); 
     if (match.Success) 
      encoding = Encoding.GetEncoding(match.ToString()); 
    } 

    encoding = encoding ?? Encoding.UTF8; 

    statusCode = ((HttpWebResponse)response).StatusCode; 
    using (var reader = new StreamReader(stream, encoding)) 
     content = reader.ReadToEnd(); 
} 
3

WebClient

Zakładam użyć WebClient ponieważ jego łatwego WebRequest-to-ciąg manipulacji. Niestety, WebClient nie ujawnia kodu odpowiedzi HTTP. Można też założyć, że reakcja była pozytywna (2xx), chyba że masz exception and read it:

try 
{ 
    string content = webClient.DownloadString(url); 
} 
catch (WebException e) 
{ 
    HttpWebResponse response = (System.Net.HttpWebResponse)we.Response;  
    var statusCode = response.StatusCode; 
} 

lub jeśli jesteś naprawdę zainteresowany w kodzie sukces można wykorzystać odbicie jak wyjaśniono here.


HttpClient

Można również użyć HttpClient jeśli jesteś na .NET 4.5, który ma odsłonić kod odpowiedzi, as explained here:

using (HttpClient client = new HttpClient()) 
{ 
    HttpResponseMessage response = await client.GetAsync(url); 

    string content = await response.Content.ReadAsStringAsync(); 
    var statusCode = response.StatusCode;  
} 

HttpWebRequest

Alternatywnie, można po prostu użyć HttpWebRequest aby uzyskać jego status i odpowiedź as explained here:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
request.Method = "GET"; 
var response = (HttpWebResponse)request.GetResponse(); 

using (Stream stream = response.GetResponseStream()) 
{ 
    StreamReader reader = new StreamReader(stream); 

    string content = reader.ReadToEnd(); 
    var statusCode = response.StatusCode;  
} 
0

I mogę uzyskać nagłówek HTTP u śpiewać: request.Method = "GET";

Metoda GET powraca głowa i ciało sekcje w odpowiedzi. HTTP obsługuje również metodę HEAD - która zwraca tylko sekcję HEAD.

Możesz pobrać BODY z HttpWebResponse używając GetResponseStream method.

Powiązane problemy