尝试设置 HttpListener 会导致异常,有什么想法吗?
Trying to setup HttpListener causes an exception, any ideas?
我正在尝试为我的多人 Unity 游戏的服务器管理器设置 HttpListener,但在执行以下代码时出现异常:
using System;
using System.IO;
using System.Net;
using System.Threading;
using WebAPI.Route;
using System.Collections.Generic;
using System.Linq;
namespace WebAPI
{
public class WebListener
{
private int Port = 4444;
private HttpListener Listener;
private Thread ListenerThread;
private bool Bailout = false;
private List<IRouteController> Routes;
public WebListener(int port, List<IRouteController> routes)
{
Port = port;
Routes = routes;
string ip = Dns.GetHostEntry(Dns.GetHostName())
.AddressList
.First(x => x.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
.ToString();
Listener = new HttpListener();
Listener.Prefixes.Add("http://localhost:" + Port + "/");
Listener.Prefixes.Add("http://127.0.0.1:" + Port + "/");
Listener.Prefixes.Add("http://" + ip + ":" + Port + " /");
Listener.AuthenticationSchemes = AuthenticationSchemes.Anonymous;
Listener.Start();
ListenerThread = new Thread(Listen);
ListenerThread.Start();
}
~WebListener()
{
Bailout = true;
if (ListenerThread != null)
ListenerThread.Join();
}
private void Listen()
{
while (!Bailout)
{
var result = Listener.BeginGetContext(ListenerCallback, Listener);
result.AsyncWaitHandle.WaitOne();
}
}
private void ListenerCallback(IAsyncResult result)
{
var context = Listener.EndGetContext(result);
if (context.Request.HttpMethod == "POST")
{
string route = context.Request.Url.LocalPath.ToLower();
var controller = Routes.Where(r => route.Contains(r.GetRoute())).FirstOrDefault();
if (controller != null)
{
var json = new StreamReader(context.Request.InputStream,
context.Request.ContentEncoding).ReadToEnd();
controller.RecieveRequest(json);
}
else
{
WebLogger.LogWarning("Invalid route, no matching controller found: " + route);
}
}
context.Response.Close();
}
}
}
这是我在 Listener.Start();
线上收到的异常
Exception thrown: 'System.Net.HttpListenerException' in
System.Net.HttpListener.dll The parameter is incorrect.
我不确定我做错了什么,有什么想法吗?
你上次 Prefixes.Add
中的 " /"
导致了你的异常。
Listener.Prefixes.Add("http://" + ip + ":" + Port + " /");
// ^ this space above
但是如果你把它改成
Listener.Prefixes.Add("http://" + ip + ":" + Port + "/");
如果您运行您的应用程序没有管理员权限并且尚未向全部添加访问权限,您可能会收到拒绝访问异常 您的用户的前缀 netsh
。阅读 here 了解更多信息。
您可以使用 "http://*:" + Port + "/"
或 "http://+:" + Port + "/"
等通配符,而不是一一添加前缀。使用通配符,您无需从 AddressList
获取 IPv4 地址,这可能不是您要绑定的接口。
我正在尝试为我的多人 Unity 游戏的服务器管理器设置 HttpListener,但在执行以下代码时出现异常:
using System;
using System.IO;
using System.Net;
using System.Threading;
using WebAPI.Route;
using System.Collections.Generic;
using System.Linq;
namespace WebAPI
{
public class WebListener
{
private int Port = 4444;
private HttpListener Listener;
private Thread ListenerThread;
private bool Bailout = false;
private List<IRouteController> Routes;
public WebListener(int port, List<IRouteController> routes)
{
Port = port;
Routes = routes;
string ip = Dns.GetHostEntry(Dns.GetHostName())
.AddressList
.First(x => x.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
.ToString();
Listener = new HttpListener();
Listener.Prefixes.Add("http://localhost:" + Port + "/");
Listener.Prefixes.Add("http://127.0.0.1:" + Port + "/");
Listener.Prefixes.Add("http://" + ip + ":" + Port + " /");
Listener.AuthenticationSchemes = AuthenticationSchemes.Anonymous;
Listener.Start();
ListenerThread = new Thread(Listen);
ListenerThread.Start();
}
~WebListener()
{
Bailout = true;
if (ListenerThread != null)
ListenerThread.Join();
}
private void Listen()
{
while (!Bailout)
{
var result = Listener.BeginGetContext(ListenerCallback, Listener);
result.AsyncWaitHandle.WaitOne();
}
}
private void ListenerCallback(IAsyncResult result)
{
var context = Listener.EndGetContext(result);
if (context.Request.HttpMethod == "POST")
{
string route = context.Request.Url.LocalPath.ToLower();
var controller = Routes.Where(r => route.Contains(r.GetRoute())).FirstOrDefault();
if (controller != null)
{
var json = new StreamReader(context.Request.InputStream,
context.Request.ContentEncoding).ReadToEnd();
controller.RecieveRequest(json);
}
else
{
WebLogger.LogWarning("Invalid route, no matching controller found: " + route);
}
}
context.Response.Close();
}
}
}
这是我在 Listener.Start();
Exception thrown: 'System.Net.HttpListenerException' in System.Net.HttpListener.dll The parameter is incorrect.
我不确定我做错了什么,有什么想法吗?
你上次 Prefixes.Add
中的 " /"
导致了你的异常。
Listener.Prefixes.Add("http://" + ip + ":" + Port + " /");
// ^ this space above
但是如果你把它改成
Listener.Prefixes.Add("http://" + ip + ":" + Port + "/");
如果您运行您的应用程序没有管理员权限并且尚未向全部添加访问权限,您可能会收到拒绝访问异常 您的用户的前缀 netsh
。阅读 here 了解更多信息。
您可以使用 "http://*:" + Port + "/"
或 "http://+:" + Port + "/"
等通配符,而不是一一添加前缀。使用通配符,您无需从 AddressList
获取 IPv4 地址,这可能不是您要绑定的接口。