8 Stimmen

HTTPListener funktioniert nicht über das Netzwerk

Ich habe versucht, einen einfachen HTTP-Server mit System.Net.HTTPListener zu erstellen, aber er empfängt keine Verbindungen von anderen Computern im Netzwerk. Beispielcode:

class HTTPServer
{
    private HttpListener listener;
    public HTTPServer() { }
    public bool Start()
    {
        listener = new HttpListener();
        listener.Prefixes.Add("http://+:80/");
        listener.Start();
        listener.BeginGetContext(new AsyncCallback(ListenerCallback), listener);
        return true;
    }
    private static void ListenerCallback(IAsyncResult result)
    {
        HttpListener listener = (HttpListener)result.AsyncState;
        listener.BeginGetContext(new AsyncCallback(ListenerCallback), listener);
        Console.WriteLine("New request.");

        HttpListenerContext context = listener.EndGetContext(result);
        HttpListenerRequest request = context.Request;
        HttpListenerResponse response = context.Response;

        byte[] page = Encoding.UTF8.GetBytes("Test");

        response.ContentLength64 = page.Length;
        Stream output = response.OutputStream;
        output.Write(page, 0, page.Length);
        output.Close();
    }
}
class Program
{
    static void Main(string[] args)
    {
        HTTPServer test = new HTTPServer();
        test.Start();
        while (true) ;
    }
}

Ist mit diesem Code etwas nicht in Ordnung, oder gibt es ein anderes Problem?

Ich habe versucht, die Anwendung mit Administratorrechten auszuführen, aber wenn ich die IP-Adresse des Computers (d. h. 192.168.1.100) auf einem anderen Computer aufrufe, erhalte ich die Anfrage nicht. Der Server funktioniert einwandfrei, wenn die Anfrage von demselben Computer aus gesendet wird, auf dem die Anwendung ausgeführt wird (mit "localhost", "127.0.0.1" und "192.168.1.100"). Das Anpingen funktioniert einwandfrei. Ich habe auch Folgendes versucht nginx und das funktioniert perfekt über das Netzwerk.

Ich verwende HTTPListener als leichtgewichtigen Server, um eine Webseite mit einer Silverlight XAP-Datei mit einigen dynamischen init-Parametern, clientaccesspolicy.xml und einer einfachen mobilen HTML-Seite zu liefern.

5voto

Ich habe auch zuerst an die Firewall gedacht. Doch das Problem waren meine Endpunkte:

Aus einem Tutorial hatte ich einen Code wie den folgenden

String[] endpoints = new String[] {
    "http://localhost:8080/do_something/",
    // ...
};

Dieser Code funktioniert nur lokal und nur, wenn Sie localhost verwenden. Um die IP verwenden zu können, habe ich ihn geändert in

String[] endpoints = new String[] {
    "http://127.0.0.1:8080/do_something/",
    // ...
};

Diesmal funktionierte die Anfrage über die IP-Adresse, aber der Server reagierte nicht auf Remote-Anfragen von einer anderen IP-Adresse. Was bei mir funktionierte, war die Verwendung eines Sterns (*) anstelle von localhost und 127.0.0.1, also der folgende Code:

String[] endpoints = new String[] {
    "http://*:8080/do_something/",
    // ...
};

Ich lasse das nur hier, falls jemand über diesen Beitrag stolpert, so wie ich es getan habe.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X