Я использую следующий код для добавления прослушивателя 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 и запустил приложение с правами администратора, но безуспешно.
Как я могу разрешить запросы от удаленных устройств в локальной сети?
@Eser Извини, моя ошибка. Я имел в виду, что добавил в брандмауэр правило входящий.
however it won't listen to request from other devices inside the network. Какую ошибку вы получаете (как на стороне сервера, так и на стороне клиента)?
@Eser Никакой ошибки, просто тайм-аут на запрашивающем устройстве и никакой ошибки в приложении.
Вы можете пинговать сервер? Можете ли вы подключиться к порту серверов (например, с помощью telnet)? en.wikipedia.org/wiki/CURL
@Eser В настоящее время я не могу проверить связь с сервером или подключение к нему через telnet, так как у меня нет второго компьютера, а есть только телефон.
Сделайте необходимые настройки NAT на вашем модеме / коммутаторе / маршрутизаторе ....., мы можем протестировать это здесь ... Или удачи ....
@Eser Я просто хочу, чтобы это приложение взаимодействовало в моей локальной сети, поэтому нет необходимости изменять какие-либо настройки маршрутизатора.
Конечно, но данная информация нам мало помогает ... Как я уже сказал, удачи ...
Недавно я реализовал HTTPS с помощью HTTPListener и разрешил связь по локальной сети, добавив правило брандмауэра. Никакого ввода не требуется, все обрабатывается кодом C#. Я поделился своим решением здесь: stackoverflow.com/a/58149405/983548





Вот шаги, которые вы можете попробовать и посмотреть, помогут ли они:
Запустите Visual Studio от имени администратора:
Запустите приложение в режиме отладки.
Откройте Монитор ресурсов в Windows и убедитесь, что порт присутствует и установлен на Разрешено, не ограничено:
Если нет, добавьте правило брандмауэра для входящего трафика для порта:
Разрешить на всех доменах:
Разрешить программы:
Разрешить соединение:
Запустите 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();
}
}
}
}
}
I even added a outgoing rule to the firewall. Вам не кажется, что это должно быть правило входящий ...