【问题标题】:HttpListener Called twiceHttpListener 调用了两次
【发布时间】:2013-04-11 12:25:38
【问题描述】:

我正在使用这段代码来实现 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 方法被调用了两次,知道如何解决吗?

【问题讨论】:

  • 你的代码很好(我在我的电脑上运行它)。要么您不使用此代码,要么您的客户端发出多个请求。
  • chrome和IE发出2次请求,Firefox发出1次请求正常吗?
  • MTA,我用 IE 和 chrome 测试过,都发出 1 个请求。
  • 将 Fiddler 放在两者之间以查看正在发出的请求。插件是否正在运行,是否正在请求网站图标?

标签: c# .net


【解决方案1】:

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

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

我希望这对某人有所帮助。

【讨论】:

  • 确实有帮助。谢谢!
【解决方案2】:

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

【讨论】:

  • 问题是我需要向服务器发送一个命令来下载文件并且它现在下载文件两次
  • 我不确定你是否正确使用IAsyncResult...看看here
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-25
    • 2013-01-21
    • 2012-09-08
    • 2016-04-27
    • 2019-02-27
    • 1970-01-01
    • 2019-12-04
    • 2018-09-15
    相关资源
    最近更新 更多