HTTPListener не работает по сети - PullRequest
4 голосов
/ 16 марта 2012

Я пытался создать простой HTTP-сервер, используя System.Net.HTTPListener, но он не получает соединения от других компьютеров в сети. Пример кода:

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) ;
    }
}

Что-то не так с этим кодом или есть другая проблема?

Я пытался запустить приложение с правами администратора, но когда я просматриваю IP-адрес компьютера (то есть 192.168.1.100) на другом компьютере, я никогда не получаю запрос. Сервер работает нормально, если запрос отправляется с того же компьютера, на котором запущено приложение (с использованием «localhost», «127.0.0.1» и «192.168.1.100»). Пинг работает отлично. Я также попробовал nginx , и это прекрасно работает по сети.

Я использую HTTPListener в качестве облегченного сервера для доставки веб-страницы с файлом Silverlight XAP с некоторыми динамическими параметрами инициализации, clientaccesspolicy.xml и простой мобильной HTML-страницей.

Ответы [ 2 ]

26 голосов
/ 16 марта 2012

Брандмауэр

0 голосов
/ 11 января 2018

Сначала я подумал о брандмауэре. Однако проблема, где мои конечные точки:

Из учебника у меня был код, подобный следующему

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

Этот код работает только локально и только если вы используете localhost. Чтобы иметь возможность использовать IP, я изменил его на

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

На этот раз запрос по ip-адресу работал, но сервер не отвечал на удаленные запросы с другого ip. Что заставило меня работать, так это использовать звездочку (*) вместо localhost и 127.0.0.1, поэтому следующий код:

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

Просто оставьте это здесь, если кто-то наткнется на этот пост, как я.

...