出于某种原因,当请求通过非标准地址发送到HttpListener时,它返回
- <h1>Bad Request (Invalid Hostname)</h1>
示例包:
- GET /index HTTP/1.1
- Host: ::ffff:88.118.32.126:2548
- Accept: */*
- HTTP/1.1 400 Bad Request
- Content-Type: text/html
- Server: Microsoft-HTTPAPI/1.0
- Date: Wed,02 Feb 2011 19:05:18 GMT
- Connection: close
- Content-Length: 39
- <h1>Bad Request (Invalid Hostname)</h1>
我怎么能解决这个问题?
编辑:
这是我的代码
- public class Server
- {
- private HttpListener Listener;
- private Log Log;
- public int Port = 1555;
- public Server(Log _log)
- {
- Log = _log;
- }
- public void Start()
- {
- Listener = new HttpListener();
- Listener.Prefixes.Add(string.Format("http://{0}:{1}/","88.118.32.126",Port));
- Listener.Prefixes.Add(
- string.Format("http://{0}:{1}/","*",Port)); //added these for testing,but still nothing
- Listener.Prefixes.Add(
- string.Format("http://::ffff:{0}:{1}/",but still nothing
- Listener.Start();
- Listener.BeginGetContext(ProcessRequest,Listener);
- Log.Add(string.Format("HTTP Server started on port {0}",Port),LogType.Info,true);
- }
- private void ProcessRequest(IAsyncResult result)
- {
- HttpListener listener = (HttpListener)result.AsyncState;
- HttpListenerContext context = listener.EndGetContext(result);
- HttpListenerRequest request = context.Request;
- HttpListenerResponse response = context.Response;
- string[] UrlParts = request.RawUrl.Split('/');
- Response output;
- if (request.RawUrl == "/index")
- output = new Response(context.Response.OutputStream,ResponseType.Stats,UrlParts,Log);
- response.ContentLength64 = output.Size;
- response.ContentType = output.Header;
- output.Send();
- if (result.IsCompleted)
- Log.Add(String.Format("OUT > {1,15} {0,8} bytes -> {2}",output.Size,request.RemoteEndPoint.Address,request.RawUrl),true);
- Listener.BeginGetContext(ProcessRequest,Listener);
- }
- }
解决方法
发生此错误的一种方法是HTTP.SYS无法将HTTP Host标头与其有效UrlAcl列表匹配.这可能是因为解析主机名时出现问题.
> Related answer explaining configuration steps
> MSDN documentation about setting up HTTP stand-alone
> Fixing a “Bad Request (Invalid Hostname)” – 400 Error,on Windows IIS Server(相关潜在解决方案和评论)
您可以在命令行列出映射:
Windows XP Support Tools/2003 Support Tools – httpcfg
- httpcfg query urlacl
包含在Windows Vista / 2008/7中 – netsh
- netsh http show urlacl