Laden...

HttpListener wirft Exception

Erstellt von Lord Hessia vor 17 Jahren Letzter Beitrag vor 17 Jahren 1.887 Views
L
Lord Hessia Themenstarter:in
497 Beiträge seit 2006
vor 17 Jahren
HttpListener wirft Exception

Hallo, ich bin seit langer Zeit auch mal wieder hier.

Ich setze in meinem Programm einen HttpListener ein, der eine Konfigurationswebseite anzeigt. Man kann auf der Webseite einige Dinge ändern und nach erfolgreicher Änderung der Konfiguration zeigt eine Webseite den Erfolg an.
In unregelmäßigen Abständen (manchmal bereits beim ersten Aufruf der Konfig-Webseite, manchmal erst beim fünften) wird eine HttpListenerException geworfen.
Könnt ihr nachvollziehen, woran das liegt?

Der Code sieht folgendermaßen aus:

/// <summary>
/// Startet einen lokalen, programminternen Webserver, der an den uebergebenen URLs lauscht.
/// </summary>
/// <param name="urls">URLs, die ueberwacht werden sollen. Es werden die uebergebenen URLs
/// und alle untergeordneten URLs beobachtet</param>
private static void listenAt(string[] urls) {
  if (!HttpListener.IsSupported) {
    log.Warn("Die bequeme Konfiguration ueber den Webbrowser " +
          "funktioniert nur unter Windows XP SP2 or Server 2003.");
    return;
  }
  
  if (urls == null || urls.Length == 0) {
    log.Warn("Es wurde keine Konfigurations-Webseite registriert. " +
                "Sie koennen das Programm somit nur ueber direktes " +
                "Bearbeiten der config.xml-Datei konfigurieren.");
    return;
  }
            
  // Existiert bereits ein Listener? Dann diesen zunächst killen
  if (httpListener != null) {
    httpListener.Stop();
  }
  
  // Neuen Listener erzeugen und alle URL-Prefixes hinzufuegen
  httpListener = new HttpListener();
  foreach (string url in urls) {
    httpListener.Prefixes.Add(url);
    log.Info("Der HTTP-Listener wird gestartet und wartet auf Anforderungen " +
               "der Konfigurations-Webseite unter " + url + "config");
  }
  
  try {
    httpListener.Start();
    while (true) {
      // Note: The GetContext method blocks while waiting for a request.
      HttpListenerContext context = httpListener.GetContext();
      HttpListenerRequest request = context.Request;
      
      if (request.Url.AbsoluteUri.Contains("close")) {
        // Die URI enthaelt "close", wenn die Konfiguration bearbeitet wurde
        bool configChanged = false;
        
        // Lesen der eingegebenen Daten
        Stream body = request.InputStream;
        StreamReader reader = new StreamReader(body, Encoding.UTF8);
        
        String newConfig = reader.ReadToEnd();  // HIER TRITT DER FEHLER AUF
        configChanged = appSettings.updateConfig(newConfig);
	
        // Bestaetigung anzeigen, ob Konfiguration geaendert wurde
        HttpListenerResponse response = context.Response;
        // Construct a response.
        string responseString = appSettings.createConfigChangeResultPage(configChanged);
        byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString);
        // Get a response stream and write the response to it.
        response.ContentLength64 = buffer.Length;
        System.IO.Stream output = response.OutputStream;
        output.Write(buffer,0,buffer.Length);
        output.Flush();
        output.Close();
        response.Close();
        
        body.Close();
        reader.Close();
        
        // TODO: Wie kann man hier den Request schließen? In der MSDN steht:
        // If you are finished with the request, it should be closed also.
      }
      else if (request.Url.AbsoluteUri.Contains("config")) {
        // Die URI enthaelt "config", wenn die Konfigurationswebseite angezeigt werden soll
        HttpListenerResponse response = context.Response;
        // Construct a response.
        string responseString = appSettings.createConfigPage();
        byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString);
        // Get a response stream and write the response to it.
        response.ContentLength64 = buffer.Length;
        System.IO.Stream output = response.OutputStream;
        output.Write(buffer,0,buffer.Length);
        output.Flush();
        output.Close();
      }
    }
  }
  catch (Exception ex) {
    log.Error(ex.ToString());
  }
  finally {
    httpListener.Stop();
  }
}

Folgende Exception wird an der Stelle "HIER TRITT DER FEHLER AUF" gefeuert:
System.Net.HttpListenerException: Es wurde versucht, auf eine nicht vorhandene N
etzwerkverbindung zuzugreifen
at System.Net.HttpRequestStream.Read(Byte[] buffer, Int32 offset, Int32 size)

at System.IO.StreamReader.ReadBuffer()
at System.IO.StreamReader.ReadToEnd()
at StockQuoteFilter.App.listenAt(String[] urls) in c:\Dokumente und Einstellu
ngen\Admin\Eigene Dateien\SharpDevelop Projects\StockQuoteFilter\App.cs:line 397

Sarkusmus ist, wenn nichts mehr hilft, außer Lachen.