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() >------------ } |