HttpListener被调用两次

本文关键字:两次 调用 HttpListener | 更新日期: 2023-09-27 18:08:33

我使用这个代码来实现Http服务器:

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被调用两次

一个答案已经被接受了,但我认为它可能对其他人仍然有用。

默认情况下,大多数给定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

如果你的网站需要多次调用服务器,它将被调用多次。当你的页面上有图片或其他东西时,就会发生这种情况。
尝试调用同步方法_httpListener.GetContext()或与lockMutex同步调用。

我不确定,但我想我看到了你的代码可能存在的问题。您正在混合两种异步处理模式通过等待异步结果中的等待句柄来释放主线程。但我认为这只表明你可以调用endgetcontext,而不是另一个线程可以使用侦听器。如果你正在使用回调模式,你应该使用等待句柄来释放主线程,而不是asyncresult

中提供的句柄。