Laden...

URL über Browser erreichbar, aber über Programm 404

Erstellt von Jack_AI vor 14 Jahren Letzter Beitrag vor 14 Jahren 2.934 Views
J
Jack_AI Themenstarter:in
193 Beiträge seit 2007
vor 14 Jahren
URL über Browser erreichbar, aber über Programm 404

Hallo Community,

Problem: Wenn ich einen existierenden Artikel in der Wikipedia per WebRequest aufrufe, funktioniert alles. Wenn ich allerdings absichtlich einen Artikel aufrufe, der nicht existiert, erhalte ich eine WebException "Der Remoteserver hat einen Fehler zurückgegeben: (404) Nicht gefunden".

Rufe ich dieselbe URL per Firefox auf, so komme ich zumindest auf eine Wikipedia-Seite, wo mir gesagt wird, dass die Seite nicht existiert (z.B. http://de.wikipedia.org/wiki/Blablbabla). Und genau den Code von dieser Seite hätte ich gerne.

Meine Funktion sieht folgendermaßen aus:


    private static StreamReader CreateReader(string URL)
    {
      HttpWebRequest Request = (HttpWebRequest)WebRequest.Create(URL);
      Request.Accept = "text/xml"; // <- verhindert 403 Fehler
      WebResponse Response = Request.GetResponse(); // <- hier tritt der Fehler auf
      Stream ResponseStream = Response.GetResponseStream();
      StreamReader Reader = new StreamReader(ResponseStream);

      return Reader;
    }

Wer eine Idee hat, möge sie doch bitte mitteilen. Meine Vermutung: Wikipedia blockt böse Bots. Dafür musste ich schon das Attribut Accept ändern, um einen 403-Fehler zu verhindern. Ich kann mir vorstellen, dass man für den Request einfach noch ein paar Attribute ändern muss, damit das ganze mehr nach Browser aussieht. Die Attribute UserAgent und Credentials habe ich schon ausprobiert, ohne Erfolg.

Danke im Voraus,
Jack

M
35 Beiträge seit 2009
vor 14 Jahren

Installiere mal "Live HTTP Headers" als Addon für Firefox.
Dort kannst Du mitverfolgen was genau passiert wenn Du einen falschen Artikel aufrufst.
Auch Firefox bekommt einen 404-Status zurück, allerdings werden IMO auch Daten mitgesendet, welche die Fehler-Seite ist, die Du beschrieben hast.

Ich würde an deiner Stelle wahrscheinlich eine Funktion schreiben, welche vorher prüft ob der Artikel existiert.
Sie könnte wie folgt aussehen:

bool TopicExists(String URL)
{
	try
	{
		HttpWebRequest Request = (HttpWebRequest)WebRequest.Create(URL);
		Request.Accept = "text/xml";
		WebResponse Response = Request.GetResponse();
		return true;
	}
	catch
	{
		return false;
	}
}

Lg Chris

// Edit mochte "boolean" nicht 😦

J
Jack_AI Themenstarter:in
193 Beiträge seit 2007
vor 14 Jahren

Hallo Mentor49,

das mit dem Firefox-Addon ist ein wirklich guter Tipp. Ich habe es mir jetzt heruntergeladen und ausprobiert. Ich bin zu derselben Beobachtung gekommen: Auch Firefox bekommt einen 404-Fehler. Aber erstaunlicherweise hat er trotzdem Daten bekommen, um daraus eine Seite zu bilden.

Ich habe spaßeshalber auch mal alle Felder der WebException durchsucht, bin aber nicht fündig geworden.

Grüße,
Jack

1.696 Beiträge seit 2006
vor 14 Jahren

Auch Firefox bekommt einen 404-Fehler. Aber erstaunlicherweise hat er trotzdem Daten bekommen, um daraus eine Seite zu bilden.

Das ist nichts erstaunliches. Die Seite, die FF anzeigt ist eine modifizierte 404-Seite vom Webserver, beim Versenden von 404-Seite bekommt der Browser (Empfänger) immer den HTTP 404 mit.

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

J
Jack_AI Themenstarter:in
193 Beiträge seit 2007
vor 14 Jahren

Das ist nichts erstaunliches. Die Seite, die FF anzeigt ist eine modifizierte 404-Seite vom Webserver, beim Versenden von 404-Seite bekommt der Browser (Empfänger) immer den HTTP 404 mit.

Mhh... okay. Wenn du mir jetzt noch sagen könntest, wie ich mit meinem Programm da herankommen...

Grüße,
Jack

1.696 Beiträge seit 2006
vor 14 Jahren

Mhh... okay. Wenn du mir jetzt noch sagen könntest, wie ich mit meinem Programm da herankommen...

Du liest einfach den ResponseText über den WebException-Objekt aus, etwa so:

            try
            {
                HttpWebRequest Request = (HttpWebRequest)WebRequest.Create("http://de.wikipedia.org/wiki/Blablbabla");
                WebResponse Response = Request.GetResponse();
                
            }
            catch (WebException ex)
            {
                
                byte[] response = new byte[ex.Response.GetResponseStream().Length];
                int ret = ex.Response.GetResponseStream().Read(response, 0, response.Length);
                System.Text.Encoding enc = System.Text.Encoding.ASCII;
                // ResponseText in String
                string myString = enc.GetString(response);
            }

[edit]

  • ungetestet, aber es müßte bei 404 gehen
  • du musst natürlich prüfen, ob 404 zurückkommt, das überlasse ich dir.

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

M
35 Beiträge seit 2009
vor 14 Jahren

Nur so nebenbei: Warum willst du eigentlich umbedingt die Daten der 404-Seite haben?
Wenn der Status 404 auftritt, weißt du doch was Sache ist.
Der Artikel ist nicht verfügbar.
Wofür dann das übliche "Diese Seite existiert nicht..." einlesen?

Natürlich weiß ich nicht was du überhaupt vorhast 😉
Allerdings intressiert mich eben, warum du das umbedingt brauchst (;

Lg Chris

J
Jack_AI Themenstarter:in
193 Beiträge seit 2007
vor 14 Jahren

@vbprogger:

Vielen Dank! Der Code funktioniert genauso, wie du ihn gepostet hast. Ich habe lediglich die Codierung auf UTF8 gestellt. Aber grundsätzlich funktioniert es auch mit ASCII. Hast du das aus dem Kopf schnell runtergecoded, weil du meintest, es ist ungetestet? Wenn ja, finde ich das sehr erstaunlich.

Als Ergänzung noch: Um zu prüfen, ob die Seite den Fehler 404 zurück gegeben hat, kann man folgendes machen:


((HttpWebResponse)ex.Response).StatusCode == HttpStatusCode.NotFound

@Mentor49:

Berechtigte Frage. Bei Wikipedia ist die 404-Seite in der Tat ziemlich uninteressant. Auf Wiktionary jedoch, das auf der Wikipedia-Software basiert, ist die Sache schon interessanter. Dort bekommt man nämlich einen Vorschlag, welches Wort am ehesten dem gesuchten entspricht. Das könnte sich als nützlich erweisen... 😃

M
35 Beiträge seit 2009
vor 14 Jahren

Ah das macht Sinn!
Besten Dank für die Info, somit kann ich heute Nacht doch noch in Ruhe schlafen ;P

Lg Chris