2014-02-25 22 views
5

Ich versuche, meinen ersten Windows-Client zu erstellen (und das ist meine Faust post sie), soll mit einem "Web-Services" kommunizieren, aber ich habe ein wenig Mühe, den Antwortheader zu lesen es kommt zurück. In meiner Antwort-Zeichenfolge habe ich ein schönes JSON-Dokument zurück (und das ist mein nächstes Problem), aber ich bin nicht in der Lage, den Header in der Antwort zu sehen/zu lesen, nur der Körper.Antwort Header lesen aus WebClient in C#

Unten ist der Code, den ich verwende.

 WebClient MyClient = new WebClient(); 
     MyClient.Headers.Add("Content-Type", "application/json"); 
     MyClient.Headers.Add("User-Agent", "DIMS /0.1 +http://www.xxx.dk"); 
     var urlstring = "http://api.xxx.com/users/" + Username.Text; 
     string response = MyClient.DownloadString(urlstring.ToString()); 

Antwort

4

Wenn Sie die vollständige Antwort sehen wollen, empfehle ich Ihnen WebRequest/WebResponse statt WebClient verwenden. Das ist eine Low-Level-API - WebClient soll einfache Aufgaben (wie das Herunterladen des Body einer Antwort als String) einfach machen.

(Oder in .NET 4.5 Sie HttpClient verwenden könnte.)

4

Hier ist ein Beispiel dafür, wie WebRequest/WebResponse verwenden, das, was über @ Jon Skeet ist sprach.

var urlstring = "http://api.xxx.com/users/" + Username.Text; 
var MyClient = WebRequest.Create(urlstring) as HttpWebRequest; 
//Assuming your using http get. If not, you'll have to do a bit more work. 
MyClient.Method = WebRequestMethods.Http.Get; 
MyClient.Headers.Add(HttpRequestHeader.ContentType, "application/json"); 
MyClient.Headers.Add(HttpRequestHeader.UserAgent, "DIMS /0.1 +http://www.xxx.dk"); 
var response = MyClient.GetResponse() as HttpWebResponse; 

for (int i = 0; i < response.Headers.Count; i++) 
    Console.WriteLine(response.Headers.GetKey(i) + " -- " + response.Headers.Get(i).ToString()); 

Auch empfehle ich Ihnen, abstrakt die http-Logik, um seinen eigenen Objekt und übergeben URL, Useragent und Content wirklich.

12

Sie können WebClient.ResponseHeaders wie folgt verwenden:

// Obtain the WebHeaderCollection instance containing the header name/value pair from the response. 
WebHeaderCollection myWebHeaderCollection = myWebClient.ResponseHeaders; 

Console.WriteLine("\nDisplaying the response headers\n"); 
// Loop through the ResponseHeaders and display the header name/value pairs. 
for (int i=0; i < myWebHeaderCollection.Count; i++)    
    Console.WriteLine ("\t" + myWebHeaderCollection.GetKey(i) + " = " + myWebHeaderCollection.Get(i)); 

Von https://msdn.microsoft.com/en-us/library/system.net.webclient.responseheaders(v=vs.110).aspx

+1

Dies ist die relevanteste und richtige Antwort für ein WebClient-Objekt (das war die OP-Frage). Ich sehe nicht, warum in diesem Fall auf HttpWebRequest- oder HttpWebResponse-Objekte verwiesen werden sollte. –

+0

für sh! Ts und kichern, wenn jemand RestSharp benutzt und auf diesen Beitrag stößt, würden Sie so etwas mit den Return-Headern machen (getestet und funktioniert): für (int i = 0; i drewid

0

Der Code unten ist sehr ähnlich zu der Dokumentation MSDN aber ich benutze Headers anstelle des ResponseHeaders und nicht erhalten die Null-Referenz-Ausnahme, die ich beim Ausführen des MSDN-Codes erhalten habe. https://msdn.microsoft.com/en-us/library/system.net.webclient.responseheaders(v=vs.110).aspx

 WebClient MyClient = new WebClient(); 
     MyClient.Headers.Add("Content-Type", "application/json"); 
     MyClient.Headers.Add("User-Agent", "DIMS /0.1 +http://www.xxx.dk"); 

     WebHeaderCollection myWebHeaderCollection = MyClient.Headers; 
     for (int i = 0; i < myWebHeaderCollection.Count; i++) 
     { 
      Console.WriteLine("\t" + myWebHeaderCollection.GetKey(i) + " = " + myWebHeaderCollection.Get(i)); 
     } 
2

Dies funktioniert auch zu

string acceptEncoding = client.ResponseHeaders["Accept"].ToString(); 
1

Eine einfache Art und Weise mit WebClient(), mit dem MSDN Beispiel kombiniert, wie oben erwähnt (das MSDN Beispiel erklärt nicht explizit, wie die Anforderung zu initiieren) . Verwechseln Sie nicht die Werte Properties.Settings.Default.XXXX, dies sind nur String-Variablen, die aus der App.settings-Datei gelesen werden. Ich hoffe, es hilft:

using (var client = new WebClient()){ 
    try{ 
     var webAddr = Properties.Settings.Default.ServerEndpoint; 
     Console.WriteLine("Sending to WebService " + webAddr); 

     //This only applies if the URL access is secured with HTTP authentication 
     if (Properties.Settings.Default.SecuredBy401Challenge) 
      client.Credentials = new NetworkCredential(Properties.Settings.Default.UserFor401Challenge, Properties.Settings.Default.PasswordFor401Challenge); 

     client.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)"); 
     client.OpenRead(webAddr); 

     // Obtain the WebHeaderCollection instance containing the header name/value pair from the response. 
     WebHeaderCollection myWebHeaderCollection = client.ResponseHeaders; 
     Console.WriteLine("\nDisplaying the response headers\n"); 

     // Loop through the ResponseHeaders and display the header name/value pairs. 
     for (int i = 0; i < myWebHeaderCollection.Count; i++) 
      Console.WriteLine("\t" + myWebHeaderCollection.GetKey(i) + " = " + myWebHeaderCollection.Get(i)); 
    } 
    catch (Exception exc){ 
     Console.WriteLine(exc.Message); 
    } 
}