HttpResponseMessage'dan içerik / mesaj alma


175

HttpResponseMessage içeriğini almaya çalışıyorum. Olmalı: {"message":"Action '' does not exist!","success":false}ama bilmiyorum, nasıl HttpResponseMessage çıkarmak için.

HttpClient httpClient = new HttpClient();
HttpResponseMessage response = await httpClient.GetAsync("http://****?action=");
txtBlock.Text = Convert.ToString(response); //wrong!

Bu durumda txtBlock değeri olacaktır:

StatusCode: 200, ReasonPhrase: 'OK', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:
{
  Vary: Accept-Encoding
  Keep-Alive: timeout=15, max=100
  Connection: Keep-Alive
  Date: Wed, 10 Apr 2013 20:46:37 GMT
  Server: Apache/2.2.16
  Server: (Debian)
  X-Powered-By: PHP/5.3.3-7+squeeze14
  Content-Length: 55
  Content-Type: text/html
}

Yanıtlar:


66

GetResponse () öğesini aramanız gerekir .

Stream receiveStream = response.GetResponseStream ();
StreamReader readStream = new StreamReader (receiveStream, Encoding.UTF8);
txtBlock.Text = readStream.ReadToEnd();

33
Teşekkürler, ama neden bu hatayı burada alıyorum: "System.Net.Http.HttpResponseMessage '' GetResponseStream 'için bir tanım içermiyor ve' System.Net.Http.HttpResponseMessage 'türünün ilk bağımsız değişkenini kabul eden' GetResponseStream 'uzantısı yok bulunabilir "
Clem

13
@Klemzy - Çünkü onu Asenkron olarak çağırıyorsunuz. ContentBunun yerine özelliği kullanmayı deneyin . Buradaki örneğe bakın . İkinci adıma ilerleyin.
Icemanind

2
@Klemzy - Buradaki örneğe bakın . İkinci adıma ilerleyin. Eğer
çözemiyorsanız,

17
Bu cevap tamamen konu dışı, OP kullanıyor / HttpClientdeğil . HttpWebRequestHttpWebResponse
Maxime Rossini

1
Soru HttpCient ile ilgili, cevabınız eski ve eski HttpWebRequest'e dayanıyor.
Payam

370

Bence en kolay yaklaşım sadece son satırı değiştirmek

txtBlock.Text = await response.Content.ReadAsStringAsync(); //right!

Bu şekilde herhangi bir akış okuyucu tanıtmanıza ve herhangi bir uzantı yöntemine ihtiyacınız yoktur.


5
Bunun neden kabul edilen cevap olmadığından emin değilsiniz, özellikle de bu, içeriği nesnelerinize kolayca serileştirebilmenizi sağladığı için.
Jason McKindly

3
ReadAsStringAsync IMHO hatalarını iyi işlemez.
stannius

16
Ayrıca beklemek yerine Response.Content.ReadAsStringAsync () öğesini de kullanabilirsiniz
Justin

8
Yine de dikkat edin: Yanıtta ifadeler veya başka Unicode karakterler varsa ReadAsStringAsync () atılabilir. Bunun üstesinden gelmek için Akışları (kabul edilen cevaptaki gibi) kullanmak zorunda kaldım.
Ginkgo

41

Bunu deneyin, böyle bir uzantı yöntemi oluşturabilirsiniz:

    public static string ContentToString(this HttpContent httpContent)
    {
        var readAsStringAsync = httpContent.ReadAsStringAsync();
        return readAsStringAsync.Result;
    }

ve basitçe, uzantı yöntemini çağırın:

txtBlock.Text = response.Content.ContentToString();

Umarım bu sana yardımcı olur ;-)


Şimdiye kadar kalkmak ve koşmak en kolay
Aage

Kodunuz zaman uyumsuz programlamayı işleyemiyorsa, lütfen ... awaityerine .Resultveya senkronize bir HTTP istemcisi kullanın. Ancak herhangi bir modern kod, aksi takdirde uygulamanızın yanlış bir şey yaptığını gösteren bir işaret olabilir.
Maxime Rossini

9

Belirli bir türe (örneğin, testler dahilinde) yayınlamak istiyorsanız ReadAsAsync uzantı yöntemini kullanabilirsiniz :

object yourTypeInstance = await response.Content.ReadAsAsync(typeof(YourType));

veya eşzamanlı kod için aşağıdakiler:

object yourTypeInstance = response.Content.ReadAsAsync(typeof(YourType)).Result;

Güncelleme: Nesne bildirimli yerine belirli tür örneğini döndüren genel ReadAsAsync <> seçeneği de vardır :

YourType yourTypeInstance = await response.Content.ReadAsAsync<YourType>();

2
nesne yourTypeInstance = yanıt bekliyor. Content.ReadAsAsync (typeof (YourType)); var olmalıdır yourTypeInstance = yanıt bekliyor. Content.ReadAsAsync <YourType> ();
Thomas.Benz

Json'ı ayrıştırmak için Request.Content.ReadAsAsync kullandım ve korkunç bir performans elde ettim.
W.Leto

4

Rudivonstaden tarafından cevap

`txtBlock.Text = await response.Content.ReadAsStringAsync();`

ancak yöntemi zaman uyumsuz yapmak istemiyorsanız kullanabilirsiniz

`txtBlock.Text = response.Content.ReadAsStringAsync();
 txtBlock.Text.Wait();`

Bekle () önemlidir, çünkü zaman uyumsuz işlemler yapıyoruz ve devam etmeden önce görevin tamamlanmasını beklemeliyiz.


3
.Resultfarklı kullanarak ?,httpContent.ReadAsStringAsync().Result
mkb

.Resultbu satırda iş parçacığının yürütülmesini engelleyecekti ... txtBlock.Text.Wait()wait () çağrısındaki bloklar olarak ... yani temelde hiçbir farkın olmadığı doğru. Ancak txtBlock.Text.Wait(), önceki ReadAsStringAsync()çağrı asla geri dönmezse GUI'nin askıda kalmaması için isteğe bağlı bir tamsayı parametresi alacağından şüpheleniyorum . Örneğin, aşağıdakiler 1 saniyeden fazla engellemeztxtBlock.Text.Wait(1000)
benhorgen

3

Önerdiğim hızlı cevap:

response.Result.Content.ReadAsStringAsync().Result


Deme Resultgörevler üzerinde. Başvurunuzu kilitleme riskiniz vardır. Bunun yerine async / await komutunu kullanın.
eltiare

Asla demeyeceğim ... bazen çabuk ve kirli olur. Ancak ReadAsStringAsync(), geri dönmeme riskini aldığınızı kabul ediyorum , bu nedenle GUI'nizde veya ana uygulama dizinizde aramamaya dikkat edin.
benhorgen

1

Aşağıdaki resim Tdönüş türü olarak gelmesi gerekenlere yardımcı olduğunu düşünüyorum .

resim açıklamasını buraya girin


0

GetStringAsyncYöntemi kullanabilirsiniz :

var uri = new Uri("http://yoururlhere");
var response = await client.GetStringAsync(uri);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.