5

Я пытаюсь загрузить строку с ЛЮБОЙ веб-страницы в моей портативной библиотеке классов. Я создал самые основные настройки:Загрузите строку из URL-адреса с помощью переносимой библиотеки классов (PCL)

  • создал новый проект PCL
    • совместимый с WP8 и WinRT, а также обязательные компоненты, такие как Silverlight

Как WebClient не является совместимым в этих системах, невозможно использовать:

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

Я попытался использовать это как хорошо (использует 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(); 
} 

Однако, когда я называю второй набор кода из внешнего C# приложения, ссылающегося на PCL, отладчик просто выдает предупреждение или ошибка сообщение:

request.GetResponseAsync(); 

Есть ли простой способ загрузить строку, которую мне не хватает?

* также, почему отладчик просто выйдет без объяснений?

Edit:

Вот еще один метод, который я пытался - на основе ответа, уже предоставленной. Опять же, этот метод просто выходит и принудительно закрывает отладчик.

PCL Метод:

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

    return data; 
} 

метод вызова:

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

Вы используете это в приложение для настольных компьютеров, приложение Windows Store, приложение WP8 или что, когда вы видите это поведение? Вы уверены, что ожидаете или ожидаете выполнения всех задач? (В противном случае программа может просто запуститься до завершения и выйти до завершения загрузки.) Если вы находитесь на Windows Phone, делаете ли вы что-либо, что блокирует поток пользовательского интерфейса при завершении загрузки (то есть через Task.Wait или Task. Результат)? –

ответ

21

Установите пакеты NuGet:

  • Microsoft.Bcl.Async, который добавляет поддержку async/await к ИХЛ.
  • Microsoft.Net.Http, который добавляет HttpClient поддержку PCL.

Тогда вы можете сделать это легкий путь:

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

У меня все еще такая же проблема. Даже после того, как я создал два новых, отдельных проекта - метод просто терпит неудачу без предупреждения или исключения.Я отредактирую свое оригинальное сообщение, чтобы включить эту попытку. – user1567095

+0

Убедитесь, что ваш брандмауэр разрешает ваше приложение. Кроме того, убедитесь, что вы используете DNS. –

+0

Почему в моем мире брандмауэр вмешивается? – user1567095

1

Этот метод работал для меня, он возвратил HTML исходный код из google.com:

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