HttpListenerResponse OutputStream.Write在我的服务器上非常慢

时间:2014-07-22 12:20:21

标签: c# linux http mono webserver

我想在我的服务器上用C#设置一个非常基本的网络服务器(Linux版本2.6.32-5-vserver-amd64(Debian 2.6.32-48)。) 服务器在我的城市,接近零开销功能,如通过Apache2或Tomcat 8显示7行html需要~15ms(DNS 1ms,连接4ms,发送1ms,等待6ms,接收4ms)。 在该服务器上运行我的最小c#webserver时,接收阶段持续60ms! 我在.net框架和单声道的本地计算机上试用了它,在最坏的情况下它总是只需要一毫秒。
通过测试,我发现如果我不通过context.Response.OutputStream.Write(...)发送任何数据,它甚至比Apache2或Tomcat更快,接收速度降至0ms!
发送标题不会使它变慢并且工作正常。
Mono 3.0.6在服务器上运行,我在Windows PC上使用3.0.6进行测试。

归结为这个问题:
为什么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 个答案:

答案 0 :(得分:4)

我找到了解决方案,或者更确切地说是解决方法:
如果我用左

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

并且根本不要快速写入Stream。很好,但我仍然没有得到它。