HttpListenerResponse OutputStream.Write очень медленно на моем сервере

Я хотел установить очень простой веб-сервер в C# на моем сервере (Linux версия 2.6.32-5-vserver-amd64 (Debian 2.6.32-48).
Сервер находится в моем городе, и почти нулевая служебная функция, такая как отображение 7 строк HTML-кода через Apache2 или Tomcat 8, занимает ~15 мс (DNS 1 мс, соединение 4 мс, отправка 1 мс, ожидание 6 мс, получение 4 мс).
При запуске моего минимального веб-сервера C# на этом сервере этап приема длится 60 мс!
Я опробовал его на своем локальном компьютере в.net framework и mono, и это в худшем случае всегда занимает всего одну миллисекунду.
Проведя небольшое тестирование, я обнаружил, что если я не отправляю данные через context.Response.OutputStream.Write (...), это даже быстрее, чем Apache2 или Tomcat, а Receiving снижается до 0 мс!
Отправка заголовков не делает это медленнее и работает нормально.
Mono 3.0.6 работает на сервере, и я использовал 3.0.6 на моем ПК с Windows для тестирования.

Это сводится к вопросу:
Почему OutputStream.Write (...) так медленно работает на моем сервере и как мне это исправить?

Вот код C#:

internal class Program
{
    private static void Main(string[] args)
    {
        System.Net.HttpListener listener = new System.Net.HttpListener();
        listener.Prefixes.Add("http://domain.tld:7777/");
        //listener.Prefixes.Add("http://localhost:7777/");
        //listener.Prefixes.Add("http://127.0.0.1:7777/");
        listener.Start();

        while (true)
        {
            System.Net.HttpListenerContext context = listener.GetContext();
            System.Threading.Tasks.Task.Factory.StartNew(() => { ProcessRequest(context); });
        }
    }

    private static void ProcessRequest(System.Net.HttpListenerContext context)
    {
        System.Net.HttpListenerResponse response = context.Response;
        response.ContentType = "text/html";
        byte[] bytes = GetBytes("Testtext");
        response.OutputStream.Write(bytes, 0, bytes.Length); // this line makes the request 60ms slower!
        context.Response.Headers.Add("headerName", "This is the headervalue");
        response.Close();
    }

    private static byte[] GetBytes(string str)
    {
        byte[] bytes = new byte[str.Length * sizeof(char)];
        System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
        return bytes;
    }
}

1 ответ

Я нашел решение, или, вернее, обходной путь:
Если я использую

response.Close(bytes, bool); // doesn't matter whether boolean is true or false

и вообще не пишите в Поток, это невероятно быстро. Хорошо со мной, но я все еще не понимаю.

Другие вопросы по тегам