Чтение заголовка ответа от WebClient в С#

Я пытаюсь создать свой первый клиент Windows (и это мой первый пост о ней), он должен общаться с «веб-сервисами», но у меня есть некоторые проблемы с чтением заголовка ответа, который возвращается. В моей строке ответа я получил обратно хороший документ JSON (и это моя следующая проблема), но я не могу «увидеть/прочитать» заголовок в ответе, только тело.

Ниже приведен код, который я использую.

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

person user3352795    schedule 25.02.2014    source источник


Ответы (6)


Вы можете использовать WebClient.ResponseHeaders следующим образом:

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

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

person RMazitov    schedule 08.09.2015
comment
Это наиболее актуальный и правильный ответ для объекта WebClient (это был вопрос ОП). Я не понимаю, почему в этом случае нужно было ссылаться на объекты HttpWebRequest или HttpWebResponse. - person Dave Lawrence; 03.12.2015
comment
для дерьма и смеха, если кто-то использует RestSharp и наткнется на этот пост, вы должны сделать что-то вроде этого с возвращаемыми заголовками (проверено и работает): for (int i = 0; i ‹ response.Headers.Count; i++) { headerString = headerString + response.Headers[i].Name + : + response.Headers[i].Value + ((char)10); } - person drewid; 09.01.2016

Если вы хотите увидеть полный ответ, я предлагаю вам использовать WebRequest/WebResponse вместо WebClient. Это более низкоуровневый API — WebClient предназначен для упрощения очень простых задач (таких как загрузка тела ответа в виде строки).

(Или в .NET 4.5 вы можете использовать HttpClient.)

person Jon Skeet    schedule 25.02.2014

Вот пример того, как использовать WebRequest/WebResponse, о чем говорил @Jon Skeet.

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

Также я настоятельно рекомендую вам абстрагировать логику http от собственного объекта и передать URL-адрес, UserAgent и ContentType.

person null_pointer    schedule 25.02.2014

Это тоже работает

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

Простой способ с использованием WebClient() в сочетании с примером MSDN, как указано выше (пример MSDN явно не объясняет, как инициировать запрос). Не смущайтесь значениями Properties.Settings.Default.XXXX, это просто строковые переменные, считанные из файла App.settings. Я надеюсь, что это помогает:

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);
    }
}
person fRENCHfRIES64    schedule 24.01.2017

Приведенный ниже код очень похож на документацию MSDN, но я использую Headers вместо ResponseHeaders и не получил исключение нулевой ссылки, которое я получил при запуске кода 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));
        }
person Gaspare Bonventre    schedule 29.03.2016