1

このコードを使用して 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

メソッドは2回呼び出されますが、修正方法はありListenerCallbackますか?

4

3 に答える 3

5

回答はすでに受け入れられていますが、その後も他の人に役立つ可能性があると思います。

デフォルトでは、URL が指定されたほとんどのブラウザーは、少なくとも 2 回の呼び出しを行います。1 回はリクエスト URL を呼び出し、もう 1 回は 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

これが誰かに役立つことを願っています。

于 2014-08-11T06:12:26.917 に答える
2

Web サイトでサーバーへの呼び出しが複数回必要な場合は、複数回呼び出されます。これは、ページに写真やその他のものがある場合に発生します。
同期メソッドを呼び出す_httpListener.GetContext()か、呼び出しを または と同期lockしてみてくださいMutex

于 2013-04-11T12:32:37.090 に答える