Dieter72: C# - verzweifelte Gehversuche ohne Erfolg

Hallo,

bei dem nachfolgendem Code würde ich euch gerne um eure Hilfe bitten, da ich nicht sehe, warum selbiger nicht funktioniert.
Zuerst noch meine Entschuldigung das ich hier den ganzen Code poste, aber anders geht's ja leider nicht...

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
using System.Net;  
using System.IO;  
using System.Text.RegularExpressions;  
  
namespace TLDSpider  
{  
    class Program  
    {  
		static bool pruefTx(string tmp)  
        {  
            string pat = "0123456789abcedfghijklmnopqrstuvwxyz, @-_;&.";  
            foreach (char ch in tmp)  
            {  
                if (pat.IndexOf (ch) < 0)  
                    return false;  
            }  
            return true;  
        }  
		static void loadWF()  
		{  
// Mit den nachfolgenden Zeilen an die Adresse (URL) ein Webrequest gesendet und die Antwort ist eine Liste mit Domainnamen die das Script abarbeiten soll.  
// Dieses funktioniert auch ohne Probleme.  
  
			string url = "http://www.script1.de";  
			HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);  
			HttpWebResponse response = (HttpWebResponse)request.GetResponse();  
			StreamReader sr = new StreamReader(response.GetResponseStream());  
			string workFile = sr.ReadToEnd();  
			sr.Close();  
			response.Close();  
			string[] sepTest = new string[] { "#" };  
			string[] komString = workFile.Split(sepTest, StringSplitOptions.None);  
			string stattest = komString[0];  
			string workTLD = komString[1];  
			if(stattest=="OK") {  
				string[] sepStrTLD = new string[] { "\r\n" };  
				string ezWURL = "";  
				string wURL = "";  
				string postDAT = "";  
				string[] ezWURLS = workTLD.Split(sepStrTLD, StringSplitOptions.None);  
  
// Aus der über das obige Request geholte Liste werden die einzelnen URLs geholt - auch dieses funktioniert.  
  
				foreach (string element in ezWURLS)  
				{  
					ezWURL = element.Trim();  
					wURL = "";  
  
// Hier an dieser Stelle soll dann die einzelne URL an die Methode "checkURL" übergeben werden - ich denke das es hier zum Absturz kommt.  
  
					if(ezWURL!="") wURL = checkURL(ezWURL);  
  
// Nach der Abarbeitung der Methode "cehckURL" soll deren Ergebnis per Request/POST wieder an eine Webseite gesendet werden. Ob diese Funktion arbeitet oder nicht weiss ich nicht, da sich das Programm vorher verabschiedet.  
  
					if(postDAT!="") postDAT = postDAT + "~";  
					postDAT = postDAT+wURL;  
				}  
				string postData = "dat="+postDAT;  
				ASCIIEncoding encoding = new ASCIIEncoding();  
				byte[] baASCIIPostData = encoding.GetBytes(postData);  
				HttpWebRequest HttpWReq = (HttpWebRequest)WebRequest.Create("http://www.site2.de");  
				HttpWReq.Method = "POST";  
				HttpWReq.Accept = "text/plain";  
				HttpWReq.ContentType = "application/x-www-form-urlencoded";  
				HttpWReq.ContentLength = baASCIIPostData.Length;  
				Stream streamReq = HttpWReq.GetRequestStream();  
				streamReq.Write(baASCIIPostData,0, baASCIIPostData.Length);  
			        HttpWebResponse HttpWResp = (HttpWebResponse)HttpWReq.GetResponse();  
				Stream streamResponse = HttpWResp.GetResponseStream();  
				StreamReader antwo = new StreamReader(streamResponse);  
				string ressend = antwo.ReadToEnd();  
				Console.WriteLine(ressend);  
				Console.WriteLine(postData);  
			} else {  
				Console.WriteLine("Response Error");  
			}  
		}  
		  
		static string checkURL(string rurl)  
		{  
// Diese Methode macht mehrere Funktionen und auch Requests mit der übergebenen URL. An sich funktioniert diese, soll heissen das ich diesen Code bereits im EInsatz habe.  
// In Verbindung mit dem Code hier, stürzt das Programm aber mit einem Exeption-Error ab (unbehandelte Ausnahme/System.Uri.Format)			  
						try  
						{  
							List<string> nURLList = new List<string>();  
							nURLList.Add("w3.org");  
							nURLList.Add("google.com");  
							nURLList.Add("facebook.com");  
							nURLList.Add("google-analytics.com");  
							nURLList.Add("youtube.com");  
							nURLList.Add("googletagmanager.com");  
							nURLList.Add("googleadservices.com");  
							nURLList.Add("google.de");  
							nURLList.Add("blogger.com");  
							Console.Clear();  
							Console.Write(rurl);  
							string url = "http://www." + rurl;  
							string surl = "https://www." + rurl;  
							WebRequest.DefaultWebProxy = null;  
							HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);  
							HttpWebResponse response = (HttpWebResponse)request.GetResponse();  
							StreamReader sr = new StreamReader(response.GetResponseStream());  
							string html = sr.ReadToEnd();  
							sr.Close();  
							response.Close();  
							string wrDomain = rurl+"#";  
							string wrIPAdr = "";  
							string wrKeys = "";  
							string wrADS = "";  
							string wrANA = "";  
							string wrNURL = "";  
							try  
							{  
								// Check IP  
								IPAddress[] addresslist = Dns.GetHostAddresses(rurl);  
								string ipadr = addresslist[0].ToString();  
								if (ipadr != "") {  
									wrIPAdr = ipadr + "#";  
								} else {  
									wrIPAdr = "0#";  
								}  
								// Check Keywords  
								Match match0 = Regex.Match(html, @"name=.keywords.*content=.*>", RegexOptions.IgnoreCase);  
								if (match0.Success)  
								{  
									string isKeywords = match0.Groups[0].Value;  
									string[] sepStr = new string[] { "content=\"" };  
									string[] ezStrs = isKeywords.Split(sepStr, StringSplitOptions.None);  
									string kwords = ezStrs[1];  
									sepStr = new string[] { "\"" };  
									ezStrs = kwords.Split(sepStr, StringSplitOptions.None);  
									kwords = ezStrs[0];  
									kwords = kwords.Trim();  
									kwords = kwords.ToLower();  
									sepStr = new string[] { "," };  
									string[] ezKeys = kwords.Split(sepStr, StringSplitOptions.None);  
									kwords = "";  
									foreach (string element in ezKeys)  
									{  
										if(kwords!="") kwords = kwords+",";  
										kwords = kwords+element.Trim();  
									}  
									if(Program.pruefTx(kwords)==true) {  
										wrKeys = kwords + "#";  
									} else {  
										wrKeys = "0#";  
									}  
								} else {  
									wrKeys = "0#";  
								}  
								// Check Adsense  
								Match match1 = Regex.Match(html, @"pub\-[0-9]*", RegexOptions.IgnoreCase);  
								if (match1.Success)  
								{  
									string isAdsense = match1.Groups[0].Value;  
									wrADS = isAdsense + "#";  
								} else {  
									wrADS = "0#";  
								}  
								// Check Analytics  
								Match match2 = Regex.Match(html, @"ua\-[0-9]*\-[0-9]*", RegexOptions.IgnoreCase);  
								if (match2.Success)  
								{  
									string isAnalytics = match2.Groups[0].Value;  
									wrANA = isAnalytics+"#";  
								} else {  
									wrANA = "0#";  
								}  
								// Check new URLs  
								MatchCollection nURL = Regex.Matches(html, @"https?://www\.?[a-zA-Z0-9\-\.]+\.(com|org|net|biz|info|de|us|COM|ORG|NET|BIZ|INFO|DE|US)");  
								string sigURL = "";  
								for (int i = 0; i < nURL.Count;i++ )  
								{  
									sigURL = "";  
									if(nURL[i].Groups[0].Value!=url && nURL[i].Groups[0].Value!=surl && nURL[i].Groups[0].Value!="") {  
										sigURL = nURL[i].Groups[0].Value;  
										sigURL = sigURL.ToLower();  
										sigURL = sigURL.Replace("http://www.", "");  
										sigURL = sigURL.Replace("https://www.", "");  
										int iSuchIndex = 1;  
										iSuchIndex = nURLList.IndexOf(sigURL);  
										if(iSuchIndex<0) {  
											nURLList.Add(sigURL);  
											if(wrNURL!="") wrNURL = wrNURL+"+";  
											wrNURL = wrNURL+sigURL;  
										}	  
									}  
								}  
							}  
							catch (Exception)  
							{  
								wrIPAdr = "ERR-DNSEXC";  
							}  
							string retUWert = wrDomain+wrIPAdr+wrKeys+wrADS+wrANA+wrNURL;	  
							return retUWert;  
						}  
						catch (WebException)  
						{  
							string retUWert = rurl+"#ERR-NOCON";  
							return retUWert;  
						}  
						  
		}  
		  
		  
        static void Main(string[] args)  
        {  
			Program.loadWF();  
		}  
    }  
}

So, wie schon in dem Comments im Code geschrieben, läuft das Teil nicht sondern verabschiedet sich mit einem Absturz (unbehandelte Ausnahme).
Allerdings verstehe ich nicht warum das so ist.
Ferner dachte ich, das die URLS in der Schleife nacheinander, soll heissen: einzelene URL ermittelt und an Methode übergeben und dann nach Abarbeitung dieser erst die zweite usw...
Wenn ich mir das aber in der Console ausgeben lasse, sieht das eher so aus als ob die Methodenaufrufe hinterher kommen.

Ich hoffe daher mal auf eure Mithilfe - ach ja, wie unschwer zu erkennen sein sollte bin ich Anfänger im Bereich C# - daher geht bitte nicht allzu hart mit mir ins Gericht...

Gruss
Dieter

  1. Tach!

    Zuerst noch meine Entschuldigung das ich hier den ganzen Code poste, aber anders geht's ja leider nicht...

    Eigentlich geht es immer auch anders. Du könntest den Fehler soweit eingrenzen, dass du ihn in einem neuen Minimal-Projekt nachstellen kannst. Da lässt sich dann auch wesentlich einfacher helfen, weil man nicht zu viel Überflüssiges durcharbeiten muss. Weiterhin ist das Problem im ersten Schritt für mich nicht nachvollziehbar, weil bei mir schon eine Exception wegen Nichterreibarkeit von http://www.script1.de kommt. Ich mag es nicht, nur theoretisch durch Codelesen den Fehler zu finden. Ich möchte selbst den Code laufen lassen können, um genau zu sehen, was passiert. Dann kann ich dir nämlich auch gezielt sagen, worauf du achten musst, um dem Fehler auf die Spur zu kommen.

    // Hier an dieser Stelle soll dann die einzelne URL an die Methode "checkURL" übergeben werden - ich denke das es hier zum Absturz kommt.

    Für C#-Programmierung gibt es das Visual Studio (auch kostenlos). Beide haben einen Debugger eingebaut, mit dem man zur Not einzelschrittweise durch das Programm durchlaufen und sich dabei immer die Inhalte der Variablen anzeigen lassen kann (mit der Maus drüberfahren reicht dafür). Komfortabler geht Debuggen kaum. Du kannst also sehr gezielt Debugging betreiben und muss dich nicht auf Vermutungen einlassen. (Außerdem gibt es SharpDevelop und MonoDevelop, die das ebenfalls können müssten.)

    Ich hoffe daher mal auf eure Mithilfe - ach ja, wie unschwer zu erkennen sein sollte bin ich Anfänger im Bereich C# - daher geht bitte nicht allzu hart mit mir ins Gericht...

    Wenn ich mehr als "Nutze Debugging!" sagen soll, bitte ich um ein auf den Fehler eingegrenztes und nachvollziehbares Programm. Du kannst aber auch gern mit deinen durch Debugging herausgefundenen neuen Erkenntnissen Fragen stellen, wenn dir dabei was unklar ist.

    dedlfix.

  2. Eine Exception kommt fuer gewoehnlich mit einem Indikator daher in welcher Zeile vom Source Code die Exception auftrat??

    Eine Exception hat meisten auch einen speziellen Typ, z.b. InvalidOperationException oder ArgumentException. Waere auch ganz interessent zu wissen, womit da genau geworfen wurde.

    Da wohl laut deinen Angaben irgendwas mit

    System.Uri.Format

    nich passt und ich auf die Schnelle keine explizite Verwendung von einem Uri Objekt  entdecken konnte, wuerde ich den Ursprung der Exception hier vermuten:

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

    Dem .Create uebergibst du einen String, der intern wohl erstmal zu einem Uri Objekt geparst wird (was dann abfackt), d.h. der Inhalt von 'url' duerfte kein gueltiges Uri Format aufweisen, vielleicht fuer manche Eingaben schon, fuer andere nicht.

    Ansaetze zum Loesen:

    • schrittweises Debuggen
    • (mehr) Kontrollausgaben
    • Aufteilung des Spaghetti Codes ein kleinere Funktionen/Methoden, mit eigener Fehlerbehandlung

    Cheers, FF