Jon*_*ohl 2 c# networking webserver firewall 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";
}
}
Run Code Online (Sandbox Code Playgroud)
这在本地计算机上运行良好,但它不会侦听来自网络内其他设备的请求。我什至添加了一个外向的防火墙的传入规则允许连接,我使用添加了 URLnetsh http add urlacl url="http://+:18991/" user=everyone并以管理员权限启动了应用程序,但没有成功。
如何允许来自 LAN 内远程设备的请求?
您可以尝试以下步骤,看看是否有帮助:
以管理员身份启动 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();
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3118 次 |
| 最近记录: |