System.AccessViolationException генерируется при добавлении «Accepted-Language» в заголовки предварительного запроса HtmlWeb - PullRequest
0 голосов
/ 26 марта 2019

При отладке моего UWP-приложения оно выдает System.AccessViolationException с сообщением ' Попытка чтения или записи в защищенную память. Это часто указывает на то, что другая память повреждена. 'и трассировка стека равна нулю. Исключение выдается при попытке добавить «Accept-Language» («en-US») в заголовок предварительного запроса объекта HtmlWeb (см. Рисунок и код ниже). Запуск того же кода с помощью xUnit работает нормально. Кто-то распознает проблему?

Изображение сгенерированного исключения: https://i.imgur.com/gHkmR6q.png

public static HtmlNode GetHtmlNode(string url, string requestLanguage)
{
    var htmlWeb = new HtmlWeb();
    htmlWeb.PreRequest += (request) =>
    {
        // This line of code throws the exception (see the picture as well)
        request.Headers.Add("Accept-Language", requestLanguage);
        return true;
    };
    return htmlWeb.Load(url).DocumentNode;
}

1 Ответ

0 голосов
/ 28 марта 2019

Я решил проблему, вообще не используя HtmlWeb, как показано ниже:

public static HtmlNode GetHtmlNode(string url, string requestLanguageCode)
{
    try
    {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        request.Method = "GET";
        request.UserAgent = "Mozilla";
        request.Accept = "Accept: text/html";
        request.Headers.Add("Accept-Language: " + requestLanguageCode);

        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        var stream = response.GetResponseStream();

        using (var reader = new StreamReader(stream))
        {
            string html = reader.ReadToEnd();
            var doc = new HtmlDocument();
            doc.LoadHtml(html);
            return doc.DocumentNode;
        }
    }
    catch (WebException)
    {
        return null;
    }
}
...