5

Próbuję pobrać ciąg z dowolnej strony w mojej przenośnej bibliotece klas. Utworzyłem najbardziej podstawową konfigurację:Pobierz ciąg z adresu URL przy użyciu przenośnej biblioteki klas (PCL)

  • stworzył nowy projekt PCL
    • zgodną z WP8 i WinRT jak również obowiązkowe składniki, takie jak Silverlight

Jak WebClient nie jest kompatybilny z tymi systemami, nie można używać:

string data = new WebClient().DownloadString(); 

Próbowałem za pomocą tego jak dobrze (używa this):

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
request.Method = HttpMethod.Get; 
HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync(); 

string data = "" 
using (var sr = new StreamReader(response.GetResponseStream())) 
{ 
    data = sr.ReadToEnd(); 
} 

Jednak, kiedy wywołać drugi zestaw kodu z zewnętrznej aplikacji C# odwołującego PCL, debugger po prostu nie bez ostrzeżenia lub błędu wiadomość na:

request.GetResponseAsync(); 

Czy istnieje prosty sposób na pobranie napisu, którego mi brakuje?

* także, dlaczego debugger po prostu wyjdzie bez wyjaśnienia?

Edit:

Oto kolejny sposób próbowałem - na podstawie odpowiedzi już dostarczonych. Ponownie, ta metoda kończy działanie i wymusza zamknięcie debuggera.

Metoda PCL:

public static async Task<string> DownloadString() 
{ 
    var url = "http://google.com"; 
    var client = new HttpClient(); 
    var data = await client.GetStringAsync(url); 

    return data; 
} 

Wywołanie metody:

private static async void Method() 
{ 
    string data = await PCLProject.Class1.DownloadString(); 
    return data; 
} 
+0

Czy działa to w aplikacja komputerowa, aplikacja Windows Store, aplikacja WP8, lub co, gdy zobaczysz to zachowanie? Czy na pewno oczekujesz lub oczekujesz na wszystkie zadania? (W przeciwnym razie program może po prostu się zakończyć i zakończyć, zanim skończy się pobieranie.) Jeśli korzystasz z Windows Phone, robisz wszystko, co blokowałoby wątek UI po zakończeniu pobierania (np. Poprzez Task.Wait lub Zadanie. Wynik)? –

Odpowiedz

21

Instaluje pakiety Nuget:

  • Microsoft.Bcl.Async, który dodaje async/await wsparcia PCLS.
  • Microsoft.Net.Http, która dodaje obsługę HttpClient do PCL.

Następnie można zrobić to w prosty sposób:

var client = new HttpClient(); 
var data = await client.GetStringAsync(url); 
+0

Nadal mam ten sam problem. Nawet po tym, jak utworzyłem dwa nowe, osobne projekty - metoda kończy się niepowodzeniem bez żadnego ostrzeżenia lub wyjątku.Będę edytować mój pierwotny wpis, aby uwzględnić tę próbę. – user1567095

+0

Upewnij się, że zapora przepuszcza Twoją aplikację. Upewnij się też, że uderzasz w DNS. –

+0

Dlaczego na świecie moja zapora sieciowa przeszkadzałaby? – user1567095

1

Metoda ta pracował dla mnie, to zwrócony kod źródłowy HTML z google.com:

public async void GetStringFromWebpage() 
{ 
    using (HttpClient wc = new HttpClient()) 
    { 
     var data = await wc.GetStringAsync("http://google.com/"); 
     Debug.WriteLine("string:" + data); 
    } 
} 
Powiązane problemy