5

J'essaie de télécharger une chaîne à partir de n'importe quelle page Web de ma bibliothèque de classes portable. J'ai créé la configuration la plus basique:Télécharger une chaîne à partir d'une URL à l'aide d'une bibliothèque de classes portable (PCL)

  • a créé un nouveau projet PCL
    • compatible avec WP8 et WinRT, ainsi que les composants obligatoires tels que Silverlight

Comme WebClient n'est pas compatible entre ces systèmes, il n'est pas possible d'utiliser:

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

J'ai essayé d'utiliser cela aussi (utilise 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(); 
} 

Cependant, quand je l'appelle le deuxième jeu de code à partir d'une application externe C# faisant référence à la PCL, le débogueur échoue simplement sans l'avertissement ou une erreur message sur:

request.GetResponseAsync(); 

Existe-t-il un moyen facile de télécharger une chaîne qui me manque?

* aussi, pourquoi le débogueur sortirait-il simplement sans explication?

Edit:

Voici une autre méthode que j'ai essayé - basé sur une réponse déjà fournie. Encore une fois, cette méthode se ferme simplement et force la fermeture du débogueur.

Méthode PCL:

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

    return data; 
} 

méthode d'appel:

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

Vous utilisez ceci en une application de bureau, une application Windows Store, une application WP8, ou quoi voir lorsque vous voyez ce comportement? Êtes-vous sûr d'attendre ou d'attendre toutes les tâches? (Sinon, le programme peut simplement être exécuté et quitter avant la fin du téléchargement.) Si vous utilisez Windows Phone, faites-vous tout ce qui pourrait bloquer le thread de l'interface utilisateur à la fin du téléchargement (par exemple Task.Wait ou Task? Résultat)? –

Répondre

21

Installez les paquets NuGet:

  • Microsoft.Bcl.Async, qui ajoute async/await soutien à PCLs.
  • Microsoft.Net.Http, qui ajoute le support HttpClient aux PCL.

Ensuite, vous pouvez le faire de la manière simple:

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

J'ai toujours le même problème. Même après avoir créé deux nouveaux projets distincts, la méthode échoue simplement sans avertissement ni exception.Je vais modifier mon post original pour inclure cette tentative. – user1567095

+0

Assurez-vous que votre pare-feu laisse passer votre application. Aussi, assurez-vous que vous frappez un DNS. –

+0

Pourquoi mon pare-feu interfère-t-il dans le monde? – user1567095

1

Cette méthode a fonctionné pour moi, il a renvoyé le code source HTML de google.com:

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