Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
URL über Browser erreichbar, aber über Programm 404
Jack_AI
myCSharp.de - Member



Dabei seit:
Beiträge: 198
Herkunft: Erlangen

Themenstarter:

URL über Browser erreichbar, aber über Programm 404

beantworten | zitieren | melden

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
Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von Jack_AI am .
private Nachricht | Beiträge des Benutzers
Mentor49
myCSharp.de - Member



Dabei seit:
Beiträge: 35

beantworten | zitieren | melden

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 :(
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Mentor49 am .
private Nachricht | Beiträge des Benutzers
Jack_AI
myCSharp.de - Member



Dabei seit:
Beiträge: 198
Herkunft: Erlangen

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
vbprogger
myCSharp.de - Experte

Avatar #avatar-1820.gif


Dabei seit:
Beiträge: 1723
Herkunft: NRW/DE

beantworten | zitieren | melden

Zitat von Jack_AI
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.
---------
Bemerkung: ich beantworte keine Fragen via PM, denn das Forum soll ja was davon haben!
private Nachricht | Beiträge des Benutzers
Jack_AI
myCSharp.de - Member



Dabei seit:
Beiträge: 198
Herkunft: Erlangen

Themenstarter:

beantworten | zitieren | melden

Zitat von vbprogger
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
private Nachricht | Beiträge des Benutzers
vbprogger
myCSharp.de - Experte

Avatar #avatar-1820.gif


Dabei seit:
Beiträge: 1723
Herkunft: NRW/DE

beantworten | zitieren | melden

Zitat von Jack_AI
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.
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von vbprogger am .
Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.
---------
Bemerkung: ich beantworte keine Fragen via PM, denn das Forum soll ja was davon haben!
private Nachricht | Beiträge des Benutzers
Mentor49
myCSharp.de - Member



Dabei seit:
Beiträge: 35

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Jack_AI
myCSharp.de - Member



Dabei seit:
Beiträge: 198
Herkunft: Erlangen

Themenstarter:

beantworten | zitieren | melden

@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... :)
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Jack_AI am .
private Nachricht | Beiträge des Benutzers
Mentor49
myCSharp.de - Member



Dabei seit:
Beiträge: 35

beantworten | zitieren | melden

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

Lg Chris
private Nachricht | Beiträge des Benutzers