C# HttpListener 未连接到本地主机
C# HttpListener not connecting to localhost
我想使用 HttpListener
创建一些服务器,但是每当我使用浏览器选项卡向它发送请求时,该请求需要无限的时间才能到达服务器。
- 已尝试通过 netsh 授予使用套接字的权限。没用。
netsh http show urlacl
输出如下:
Reserved URL : http://localhost:12113/
User: \Everyone
Listen: Yes
Delegate: No
SDDL: D:(A;;GX;;;WD)
Reserved URL : http://127.0.0.1:12113/
User: \Everyone
Listen: Yes
Delegate: No
SDDL: D:(A;;GX;;;WD)
Reserved URL : http://+:12113/
User: \Everyone
Listen: Yes
Delegate: No
SDDL: D:(A;;GX;;;WD)
Reserved URL : http://*:12113/
User: \Everyone
Listen: Yes
Delegate: No
SDDL: D:(A;;GX;;;WD)
防火墙没有阻止我的端口。还是不行。
有人说 运行 管理员权限的 VS 可能有效。但是没有。
如果我尝试连接关闭的服务器(或连接到另一个未监听的端口),浏览器将 return ERR_CONNECTION_REFUSED
。但是当我在服务器打开的情况下执行此操作时,它永远不会响应。没有错误,没有成功。
服务器代码如下:
public class Server
{
public static HttpListener Listener;
public static int Port = 12113;
public Server()
{
Listener = new HttpListener();
// Yeah, I got so mad I added them all (same as urlacl)
Listener.Prefixes.Add($"http://localhost:{Port}/");
Listener.Prefixes.Add($"http://127.0.0.1:{Port}/");
Listener.Prefixes.Add($"http://+:{Port}/");
Listener.Prefixes.Add($"http://*:{Port}/");
Listener.Start();
var listenTask = HandleIncomingConnections();
listenTask.GetAwaiter().GetResult();
Listener.Stop();
}
public async Task HandleIncomingConnections()
{
while (true)
{
var context = await Listener.GetContextAsync();
var request = context.Request;
var response = context.Response;
var user = context.User;
await HandleRequest(request, response, user);
}
}
private async Task HandleRequest(HttpListenerRequest request, HttpListenerResponse response, IPrincipal user)
{
// There's a breakpoint right here so that I can inspect what I received
// and develop the server accordingly, but it is never hit.
}
public void Shutdown()
{
try
{
Listener.Stop();
}
catch
{
// ignore
}
}
}
我做错了什么?
正如Jesse de Wit and Serg所说,陷入僵局。我是这样工作的:
public Server()
{
Listener = new HttpListener();
Listener.Prefixes.Add($"http://localhost:{Port}/");
Listener.Prefixes.Add($"http://127.0.0.1:{Port}/");
Listener.Prefixes.Add($"http://+:{Port}/");
Listener.Prefixes.Add($"http://*:{Port}/");
Start();
}
public async void Start()
{
Listener.Start();
await HandleIncomingConnections();
Stop();
}
我整整一个星期都在苦苦挣扎,只是我的错误。谢谢大家。
我想使用 HttpListener
创建一些服务器,但是每当我使用浏览器选项卡向它发送请求时,该请求需要无限的时间才能到达服务器。
- 已尝试通过 netsh 授予使用套接字的权限。没用。
netsh http show urlacl
输出如下:
Reserved URL : http://localhost:12113/
User: \Everyone
Listen: Yes
Delegate: No
SDDL: D:(A;;GX;;;WD)
Reserved URL : http://127.0.0.1:12113/
User: \Everyone
Listen: Yes
Delegate: No
SDDL: D:(A;;GX;;;WD)
Reserved URL : http://+:12113/
User: \Everyone
Listen: Yes
Delegate: No
SDDL: D:(A;;GX;;;WD)
Reserved URL : http://*:12113/
User: \Everyone
Listen: Yes
Delegate: No
SDDL: D:(A;;GX;;;WD)
防火墙没有阻止我的端口。还是不行。
有人说 运行 管理员权限的 VS 可能有效。但是没有。
如果我尝试连接关闭的服务器(或连接到另一个未监听的端口),浏览器将 return
ERR_CONNECTION_REFUSED
。但是当我在服务器打开的情况下执行此操作时,它永远不会响应。没有错误,没有成功。
服务器代码如下:
public class Server
{
public static HttpListener Listener;
public static int Port = 12113;
public Server()
{
Listener = new HttpListener();
// Yeah, I got so mad I added them all (same as urlacl)
Listener.Prefixes.Add($"http://localhost:{Port}/");
Listener.Prefixes.Add($"http://127.0.0.1:{Port}/");
Listener.Prefixes.Add($"http://+:{Port}/");
Listener.Prefixes.Add($"http://*:{Port}/");
Listener.Start();
var listenTask = HandleIncomingConnections();
listenTask.GetAwaiter().GetResult();
Listener.Stop();
}
public async Task HandleIncomingConnections()
{
while (true)
{
var context = await Listener.GetContextAsync();
var request = context.Request;
var response = context.Response;
var user = context.User;
await HandleRequest(request, response, user);
}
}
private async Task HandleRequest(HttpListenerRequest request, HttpListenerResponse response, IPrincipal user)
{
// There's a breakpoint right here so that I can inspect what I received
// and develop the server accordingly, but it is never hit.
}
public void Shutdown()
{
try
{
Listener.Stop();
}
catch
{
// ignore
}
}
}
我做错了什么?
正如Jesse de Wit and Serg所说,陷入僵局。我是这样工作的:
public Server()
{
Listener = new HttpListener();
Listener.Prefixes.Add($"http://localhost:{Port}/");
Listener.Prefixes.Add($"http://127.0.0.1:{Port}/");
Listener.Prefixes.Add($"http://+:{Port}/");
Listener.Prefixes.Add($"http://*:{Port}/");
Start();
}
public async void Start()
{
Listener.Start();
await HandleIncomingConnections();
Stop();
}
我整整一个星期都在苦苦挣扎,只是我的错误。谢谢大家。