HttpListener не будет работать по сети даже с разрешенным брандмауэром

Я использую следующий код для добавления прослушивателя http:

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

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

        // URI prefixes are required, for example 
        // "http://localhost:8080/index/".
        if (prefixes == null || prefixes.Length == 0)
            throw new ArgumentException("prefixes");

        // A responder method is required
        if (method == null)
            throw new ArgumentException("method");

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

        _responderMethod = method;
        _listener.Start();
    }

    public WebServer(Func<HttpListenerRequest, HttpListenerResponse, 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, ctx.Response);
                            byte[] buf = Encoding.UTF8.GetBytes(rstr);
                            ctx.Response.ContentLength64 = buf.Length;
                            ctx.Response.OutputStream.Write(buf, 0, buf.Length);
                        }
                        catch { } // suppress any exceptions
                        finally
                        {
                            // always close the stream
                            ctx.Response.OutputStream.Close();
                        }
                    }, _listener.GetContext());
                }
            }
            catch { } // suppress any exceptions
        });
    }

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

static class Program
{
    public const int PORT = 18991;

    [STAThread]
    static void Main()
    {
        WebServer ws = new WebServer(SendResponse, "http://+:" + PORT + "/");
        ws.Run();
        Application.Run(new Form1());
        ws?.Stop();
    }
    private static string SendResponse(HttpListenerRequest request, HttpListenerResponse response)
    {
        return "ok";
    }
}

Это отлично работает на локальном компьютере, однако не будет прослушивать запросы от других устройств в сети. Я даже добавил входящее правило исходящий к брандмауэру, разрешающему соединение, я добавил URL-адрес с помощью netsh http add urlacl url = "http://+:18991/" user=everyone и запустил приложение с правами администратора, но безуспешно.

Как я могу разрешить запросы от удаленных устройств в локальной сети?

I even added a outgoing rule to the firewall. Вам не кажется, что это должно быть правило входящий ...
Eser 24.05.2018 21:43

@Eser Извини, моя ошибка. Я имел в виду, что добавил в брандмауэр правило входящий.

Jonas Kohl 24.05.2018 21:46
however it won't listen to request from other devices inside the network. Какую ошибку вы получаете (как на стороне сервера, так и на стороне клиента)?
Eser 24.05.2018 21:47

@Eser Никакой ошибки, просто тайм-аут на запрашивающем устройстве и никакой ошибки в приложении.

Jonas Kohl 24.05.2018 21:49

Вы можете пинговать сервер? Можете ли вы подключиться к порту серверов (например, с помощью telnet)? en.wikipedia.org/wiki/CURL

Eser 24.05.2018 21:52

@Eser В настоящее время я не могу проверить связь с сервером или подключение к нему через telnet, так как у меня нет второго компьютера, а есть только телефон.

Jonas Kohl 24.05.2018 21:57

Сделайте необходимые настройки NAT на вашем модеме / коммутаторе / маршрутизаторе ....., мы можем протестировать это здесь ... Или удачи ....

Eser 24.05.2018 22:00

@Eser Я просто хочу, чтобы это приложение взаимодействовало в моей локальной сети, поэтому нет необходимости изменять какие-либо настройки маршрутизатора.

Jonas Kohl 24.05.2018 22:01

Конечно, но данная информация нам мало помогает ... Как я уже сказал, удачи ...

Eser 24.05.2018 22:06

Недавно я реализовал HTTPS с помощью HTTPListener и разрешил связь по локальной сети, добавив правило брандмауэра. Никакого ввода не требуется, все обрабатывается кодом C#. Я поделился своим решением здесь: stackoverflow.com/a/58149405/983548

Habib Sheikh 28.09.2019 23:06
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
10
1 252
1

Ответы 1

Вот шаги, которые вы можете попробовать и посмотреть, помогут ли они:

  1. Запустите Visual Studio от имени администратора:

    Start Visual Studio

  2. Запустите приложение в режиме отладки.

  3. Откройте Монитор ресурсов в Windows и убедитесь, что порт присутствует и установлен на Разрешено, не ограничено:

    Resource monitor

  4. Если нет, добавьте правило брандмауэра для входящего трафика для порта:

    Разрешить на всех доменах:

    Разрешить программы:

    Разрешить соединение:

  5. Запустите HttpListener следующим образом:

using System.IO;
using System.Net;
using System.Threading.Tasks;

namespace HttpTestServer
{
    public class MainWindow
    {
        private readonly HttpListener _httpListener;

        public MainWindow()
        {
            _httpListener = new HttpListener();
            _httpListener.Prefixes.Add("http://*:9191/");
            Task.Run(Start);
        }

        public async Task Start()
        {
            _httpListener.Start();
            while (true)
            {
                var context = await _httpListener.GetContextAsync();

                using (var sw = new StreamWriter(context.Response.OutputStream))
                {
                    await sw.FlushAsync();
                }
            }
        }
    }
}
  1. Запустите ipconfig и проверьте, какой у вас IP-адрес:

  2. Отправьте эхо-запрос на свой компьютер с другого компьютера в сети:

  3. С другого компьютера также проверьте отправку HTTP-запроса на ваш компьютер:

Другие вопросы по теме