HttpListener叫了两次

我正在使用此代码来实现Http Server:

public Server() { _httpListener = new HttpListener(); _httpListener.Prefixes.Add(Server.UriAddress); StartServer(); } public void StartServer() { _httpListener.Start(); while (_httpListener.IsListening) ProcessRequest(); } void ProcessRequest() { var result = _httpListener.BeginGetContext(ListenerCallback, _httpListener); result.AsyncWaitHandle.WaitOne(); } void ListenerCallback(IAsyncResult result) { HttpListenerContext context = _httpListener.EndGetContext(result); HttpListenerRequest request = context.Request; string url = request.RawUrl; url = url.Substring(1, url.Length - 1); HttpListenerResponse response = context.Response; string responseString = url; byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString); response.ContentLength64 = buffer.Length; System.IO.Stream output = response.OutputStream; output.Write(buffer, 0, buffer.Length); output.Close(); } 

我有一个问题,如果我在浏览器中写这个(这是一个例子,它发生在每次调用):

 http://localhost:8888/Hello%20World 

ListenerCallback方法被调用两次,任何想法如何修复它?

如果您的网站需要多次调用服务器,则会多次调用它。 当您在页面上有图片或其他任何内容时会发生这种情况。
尝试调用同步方法_httpListener.GetContext()或使用lockMutex同步您的调用。

已经接受了答案,但我认为随后对其他人可能仍然有用。

默认情况下,给定URL的大多数浏览器至少会进行两次调用。 一次调用请求URL,另一次调用favicon.ico。

所以应该在ListenerCallback中进行检查

 HttpListenerContext context = _httpListener.EndGetContext(result); HttpListenerRequest request = context.Request; string url = request.RawUrl; url = url.Substring(1); if (url == "favicon.ico") { return; } //normal request handling code 

我希望这可以帮助别人。

我不确定,但我想我看到你的代码可能存在什么问题。 您正在混合两种异步处理模式通过等待异步结果中的waithandle释放主线程。 但我认为只有你可以调用endgetcontext的信号,而不是另一个线程可以使用监听器。 如果使用回调模式,则应使用asyncresult中提供的等待句柄之外的等待句柄释放主线程