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
и вообще не пишите в Поток, это невероятно быстро. Хорошо со мной, но я все еще не понимаю.