出于某种原因,当请求通过非标准地址发送到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