2015-10-30 1 views
0

J'essaie de développer une application Windows Phone qui analyse une page HTML (récupérée sur le Web) dans une variable HTMLDocument et l'utilise pour inspecter la page, récupérer des valeurs, etc. essayer de se connecter à des pages comme le BBC News Home page Je reçois une erreur.C# HtmlAgilityPack TypeAccessException lors du chargement de la page Url

System.TypeAccessException: Attempt by security transparent method 'HtmlAgilityPack.HtmlWeb.LoadFromWebAsync(System.Uri, System.Text.Encoding, System.Net.NetworkCredential)' to access security critical type 'System.Net.NetworkCredential' failed. 
    at HtmlAgilityPack.HtmlWeb.LoadFromWebAsync(Uri uri, Encoding encoding, NetworkCredential credentials) 
    at HtmlAgilityPack.HtmlWeb.<LoadFromWebAsync>d__0.MoveNext() 

Cette page ne doit pas besoin de pouvoirs, donc je suis très confus quant à la raison pour laquelle je rencontre cette erreur. Voici le code.

private async Task GetHtmlDocument(string url) 
{ 
    Debug.WriteLine("This is a line"); 
    try 
    { 
     HtmlWeb web = new HtmlWeb(); 
     HtmlDocument rootDocument = await web.LoadFromWebAsync(url); 
    } 
    catch (Exception e) 
    { 
     Debug.WriteLine("Exception: " + e); 
    } 
} 

Répondre

0

J'utilise Windows Phone 8.1 que je probablement besoin de mentionner dans la question. Ce qui suit fonctionne.

private async Task GetHtmlDocument(string url) 
{ 
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); 
    request.Credentials = new LoginCredentials().Credentials; 

    try 
    { 
     WebResponse myResponse = await request.GetResponseAsync(); 
     HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument(); 
     htmlDoc.OptionFixNestedTags = true; 
     htmlDoc.Load(myResponse.GetResponseStream()); 
    } catch (...) { ... } 
} 
1

Je pasrse Html par html-agility-pack comme ceci:

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); 

//cookie if you need 
request.CookieContainer = cookie; 
//WebRequestMethods.Http.Get 
//or WebRequestMethods.Http.Post 
request.Method = method; 
request.UserAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36"; 
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"; 
request.Headers.Add("Accept-Language", "ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4"); 
request.ServicePoint.Expect100Continue = false; 
request.Timeout = 100000; 
request.ContentType = "application/x-www-form-urlencoded"; 

using (WebResponse myResponse = request.GetResponse()) 
{ 
    HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument(); 
    htmlDoc.OptionFixNestedTags = true; 
    htmlDoc.Load(myResponse.GetResponseStream(), Encoding.GetEncoding(1251)); 
} 

puis

string text; 

HtmlAgilityPack.HtmlNode node = _doc.DocumentNode.SelectSingleNode(Xpath); 
if (node != null) text = node.InnerText; 
+0

Désolé pour la réponse différée - J'étais absent la dernière semaine. J'aurais dû mentionner que c'est pour une application Windows Phone 8.1, donc beaucoup de ce que vous mettez (par exemple request.Headers.Add) n'existent pas réellement dans le HttpWebRequest. Je dois utiliser request.getResponseAsync() et en utilisant votre méthode pour charger la réponse, j'obtiens une "System.Net.ProtocolViolationException". –

+0

Merci, votre réponse a aidé. –

+0

En tout cas, je pense qu'il peut être utile – isxaker