我正在使用以下代码添加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";
}
}
这在本地计算机上工作正常,但是它不会侦听网络内其他设备的请求。我什至在允许连接的防火墙中添加了outgoing传入规则,我使用netsh http add urlacl url="http://+:18991/" user=everyone
添加了URL,并以管理员权限启动了应用程序,但没有成功。
如何允许来自局域网内远程设备的请求?
以下是您可以尝试查看它们是否有帮助的步骤:
以管理员身份启动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();
}
}
}
}
}