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
и запустил приложение с правами администратора, но безуспешно.
Как я могу разрешить запросы от удаленных устройств внутри локальной сети?
0 ответов
Вот шаги, которые вы можете попробовать и посмотреть, помогут ли они:
Запустите Visual Studio от имени администратора:
Запустите приложение в режиме отладки.
Откройте Resource Monitor в 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();
}
}
}
}
}