Readdy Write

httpClient Fehler: Für das Unicode-Zeichen ist kein zugeordnetes Zeichen in der Mehrbytecodepage vorhanden. (Ausnahme von HRESULT: 0x80070459)

08.08.2018 (👁12364)


Problem:

Beim Lesen einer Webseite mit WPF wird beim Öffnen der URL mit einem HttpClient der Fehlercode für fehlendes Unicode-Zeichen ausgegeben.

Zunächst habe ich vermutet, dass es das encodede Zeichen [] %5B%5D  als Ursache hätte bei einem httpClient.

Die Lösung liegt aber darin, dass der HttpClient keine schwierigen UTF Codes lesen kann. Deshalb habe ich den Code umgeschrieben auf einen WPF Webrequest.

Fehlermeldung:

Für das Unicode-Zeichen ist kein zugeordnetes Zeichen in der Mehrbytecodepage vorhanden. (Ausnahme von HRESULT: 0x80070459)

URL

https://www.nigelfrank.com/de/search?keywords=&country%5B%5D=3&type=contract&order=posted

Fehlerhafter Download-Code

Windows.Web.Http.HttpClient client = new Windows.Web.Http.HttpClient(filter);

String sHTML = await client.GetStringAsync(new Uri(sURL));

 

 

Lösung: WPF, C# (teilweise UWP, 2018)

Als Webrequest lesen

                //--< download as webrequest >--

                WebRequest objRequest = WebRequest.Create(sURL);

                objRequest.CachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.NoCacheNoStore);

                HttpWebResponse objResponse = (HttpWebResponse)objRequest.GetResponse();

                //</ WebRequest and Response >

 

                //< Stream and Reader >

                Stream objDataStream = objResponse.GetResponseStream();

                StreamReader TextReader = new StreamReader(objDataStream);

                sHTML = TextReader.ReadToEnd();

                //</ Stream and Reader >

                //--</ download as webrequest >--

Kompletter Code, C#, WPF

Download als Webreqest und nicht als String

public static async Task<HtmlDocument> Web_Get_HtmlDocument(string sURL)

{

    //------------< Web_Get_HtmlDocument() >------------

    //* get the HTML Document of a website-URL      

    try

    {

        //----< Read HTML from Website >----

 

 

        //< read HTML >

        string sHTML = "";   //Client Request as string

        try

        {

            string sDownloadType = "webrequest";

            if (sDownloadType=="webrequest")

            {

                //--< download as webrequest >--

                WebRequest objRequest = WebRequest.Create(sURL);

                objRequest.CachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.NoCacheNoStore);

                HttpWebResponse objResponse = (HttpWebResponse)objRequest.GetResponse();

                //</ WebRequest and Response >

 

                //< Stream and Reader >

                Stream objDataStream = objResponse.GetResponseStream();

                StreamReader TextReader = new StreamReader(objDataStream);

                sHTML = TextReader.ReadToEnd();

                //</ Stream and Reader >

                //--</ download as webrequest >--

            }

            else

            {

                //--< download as string >--

                //-< HttpClient >-

                HttpBaseProtocolFilter filter = new HttpBaseProtocolFilter();

                filter.CacheControl.ReadBehavior = HttpCacheReadBehavior.NoCache;

                filter.CacheControl.WriteBehavior = HttpCacheWriteBehavior.Default;

                filter.CookieUsageBehavior = HttpCookieUsageBehavior.Default;

 

                Windows.Web.Http.HttpClient client = new Windows.Web.Http.HttpClient(filter);

                

                //-</ HttpClient >-

                sHTML = await client.GetStringAsync(new Uri(sURL));

                //--</ download as string >--

            }

 

        }

        catch (Exception ex)

        {

            //clsSys.show_Message(ex.Message);

            clsSys.fx_Log("Error httpClient: " + ex.Message);

            return null;

        }

        //</ read HTML >

        //----</ Read HTML from Website >----

 

 

        clsSys.fx_Log("read HTML=" + sHTML.Substring(0, 10) + "..");

 

        //< get HTMLdocument >

        //*create and load to local HtmlDocument

        HtmlDocument doc = new HtmlDocument();

        doc.LoadHtml(sHTML);

        //</ get HTMLdocument >

 

        //< output >

        return doc;

        //</ output >

    }

    catch (Exception ex)

    {

        clsSys.fx_Log("ERROR get HtmlDocument URL=" + sURL + "   Msg:" + ex.Message);

        return null;

    }

 

    //------------</ Web_Get_HtmlDocument() >------------

}


0,00 €