web-dev-qa-db-fra.com

Lire l'en-tête de réponse de WebClient en C #

J'essaie de créer mon premier client Windows (et ceci est mon premier message), il doit communiquer avec un "service Web", mais j'ai un peu de mal à lire l'en-tête de la réponse. Dans ma chaîne de réponse, ai-je reçu un document JSON de Nice (et c'est mon problème suivant), mais je ne suis pas en mesure de "voir/lire" l'en-tête de la réponse, mais uniquement le corps.

Vous trouverez ci-dessous le code que j'utilise.

        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());
10
user3352795

Vous pouvez utiliser WebClient.ResponseHeaders comme ceci:

// 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));

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

19
RMazitov

Si vous voulez voir la réponse complète, je vous suggère d'utiliser WebRequest/WebResponse au lieu de WebClient. C'est une API de plus bas niveau - WebClient est destiné à simplifier les tâches très simples (telles que le téléchargement du corps d'une réponse).

(Ou dans .NET 4.5, vous pouvez utiliser HttpClient .)

4
Jon Skeet

Voici un exemple d'utilisation de WebRequest/WebResponse, ce dont @Jon Skeet parlait. 

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());

De plus, je vous recommande vraiment de résumer la logique http en son propre objet et de lui transmettre l'URL, UserAgent et ContentType.

4
null_pointer

Une méthode simple utilisant WebClient (), combinée avec l'exemple MSDN mentionné ci-dessus (l'exemple MSDN n'explique pas explicitement comment lancer la demande). Ne soyez pas dérouté par les valeurs Properties.Settings.Default.XXXX, ce ne sont que des variables de chaîne lues à partir du fichier App.settings. J'espère que ça aide:

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);
    }
}
3
fRENCHfRIES64

Cela fonctionne aussi aussi 

string acceptEncoding = client.ResponseHeaders["Accept"].ToString();
2
Tim Davis

Le code ci-dessous est très similaire à la documentation MSDN, mais j'utilise Headers au lieu de ResponseHeaders et je n'ai pas reçu l'exception de référence null que j'ai reçue lors de l'exécution du code MSDN. 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));
        }
0
Gaspare Bonventre