2011-02-03 138 views
7

出于某种原因,当请求是通过非标准地址发送到HttpListener返回C#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}/", 
      "*", Port)); //added these for testing, 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), LogType.Info, true); 

     Listener.BeginGetContext(ProcessRequest, Listener); 
    } 
} 
+0

你能否提供一些代码?你如何启动HttpListener? – 2011-02-03 11:32:00

回答

4

的一种方法是,当HTTP.SYS无法与其有效UrlAcl的名单的HTTP主机头相匹配。这可能是因为解决主机名的问题。

  1. Related answer explaining configuration steps
  2. MSDN documentation about setting up HTTP stand-alone
  3. 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