2017-06-17 1 views
0

Ich habe einige Probleme bei der Erstellung eines lokalen Webservers mit dem HttpListener. Wenn ich localhost uri (oder 127.0.0.1) benutze, funktioniert es gut und antwortet auf die Anfragen.C# HttpListener antwortet nicht

Wenn ich jedoch eine madeup Domäne wie "whateverabc.com" hinzufüge, reagiert der Server nicht mehr auf Anfragen und chrome druckt ERR_NAME_NOT_RESOLVED Fehler.

Was ich vermisse? Vielen Dank!

public class WebServer 
{ 
    private readonly HttpListener _listener = new HttpListener(); 
    private readonly Func<HttpListenerRequest, string> _responderMethod; 

    public WebServer(string[] prefixes, Func<HttpListenerRequest, string> method) 
    {    
     if (!HttpListener.IsSupported) 
      throw new NotSupportedException(
       "Needs Windows XP SP2, Server 2003 or later."); 

     if (prefixes == null || prefixes.Length == 0) 
      throw new ArgumentException("prefixes"); 

     if (method == null) 
      throw new ArgumentException("method"); 

     foreach (string s in prefixes) 
      _listener.Prefixes.Add(s); 

     _listener.IgnoreWriteExceptions = true; 
     _responderMethod = method; 
     _listener.Start(); 
    } 

    public WebServer(Func<HttpListenerRequest, string> method, params string[] prefixes) 
     : this(prefixes, method) { } 

    public void Run() 
    { 
     ThreadPool.QueueUserWorkItem((o) => 
     { 
      Console.WriteLine("Webserver running..."); 
      try 
      { 
       while (_listener.IsListening) 
       { 
        ThreadPool.QueueUserWorkItem((c) => 
        { 
         var ctx = c as HttpListenerContext; 
         try 
         { 
          string rstr = _responderMethod(ctx.Request); 
          byte[] buf = Encoding.UTF8.GetBytes(rstr); 
          ctx.Response.ContentLength64 = buf.Length; 
          ctx.Response.OutputStream.Write(buf, 0, buf.Length); 
         } 
         catch { } // suppress any exceptions 
         finally 
         { 
          ctx.Response.OutputStream.Close(); 
         } 
        }, _listener.GetContext()); 
       } 
      } 
      catch { } // suppress any exceptions 
     }); 
    } 

    public void Stop() 
    { 
     _listener.Stop(); 
     _listener.Close(); 
    } 
} 

static void Main(string[] args) 
    { 
     WebServer ws = new WebServer(SendResponse, "http://whateverabc.com:54785/"); 
     ws.Run(); 
     Console.WriteLine("A simple webserver. Press a key to quit."); 
     Console.ReadKey(); 
     ws.Stop(); 
    } 

    public static string SendResponse(HttpListenerRequest request) 
    { 
     return string.Format("<HTML><BODY>My web page.<br>{0}</BODY></HTML>", DateTime.Now); 
    } 

Antwort

0

Es scheint ein grundlegendes Missverständnis dessen zu sein, was vor sich geht. Hier ist die Sache:

Durch die Registrierung eines Präfixes sagen Sie einfach Ihren Webserver zu Anfragen, die mit diesem Präfix beginnen und an den angegebenen Port gehen.

Wenn Sie jedoch Chrome (oder etwas anderes) verwenden, um auf Ihre Website zuzugreifen, wird zuerst eine DNS-Anfrage an Ihren konfigurierten DNS-Server gesendet, um herauszufinden, auf welche IP-Adresse die Domäne "whateverabc.com" verweist. Und da diese Adresse einfach nicht existiert (Sie können unter https://www.whois.com/ nachsehen), schlägt Ihre Anfrage fehl. Daher erhält Ihr Webserver keine Anfrage zum Starten.

Denken Sie darüber nach (oder probieren Sie es aus): Wenn Sie einen Webserver auf Ihrem lokalen Computer starten und Anfragen mit "" hören, würden Sie wirklich erwarten, dass Ihr Anruf von Chrome aus zugreift Ihr lokaler Webserver, wenn Sie die Microsoft-Website eingeben?