c# mono httplistener does not write http-headers

本文关键字:write http-headers not does mono httplistener | 更新日期: 2023-09-27 18:16:10

我有一个简单的web服务器,我想在linux上使用mono运行。在使用。net框架的windows上一切都工作得很好,但是当我尝试在mono中运行相同的应用程序时,它的行为不像预期的那样。

我使用mono 4.6.1.5 x64.net 4.5.2 x64

所以当发送请求到运行在。net中的服务器时,返回的响应是:

. net

Request URL:http://localhost:4040/
Request Method:GET
Status Code:200 OK
Remote Address:[::1]:4040
Response Headers
view source
Content-Length:9
Content-Type:text/html
Date:Thu, 03 Nov 2016 08:23:16 GMT
Server:Microsoft-HTTPAPI/2.0

预览
test data

然后,当我使用mono运行相同的构建时,服务器日志显示响应立即完成,而浏览器正在加载10秒,然后显示响应。现在的响应是:

mono

Request URL:http://localhost:4040/
Request Method:GET
Status Code:200 OK
Remote Address:127.0.0.1:4040

预览
P/1.1 200 OK
Content-Type: text/html
Server: Mono-HTTPAPI/1.0
Date: Thu, 03 Nov 2016 08:25:10 GMT
Content-Length: 9
Keep-Alive: timeout=15,max=100
test data

主监听器循环

HttpListener listener = new HttpListener();
listener.Prefixes.Add("http://*:4040/");
listener.Start();
while (true)
{
    HttpListenerContext context = listener.GetContext();
    Console.WriteLine ("Proccessing {0}", context.Request.Url.AbsolutePath);
    Process (context);
    Console.WriteLine ("Proccessing complete");
}

处理代码
private void Process(HttpListenerContext context)
{
    string data = "test data";
    WriteResponse(context.Response, data, HttpStatusCode.OK);
}
private void WriteResponse (HttpListenerResponse response, string data, HttpStatusCode status)
{
    response.StatusCode = (int)status;
    if (!string.IsNullOrEmpty(data))
    {
        response.ContentType = "text/html";
        response.ContentLength64 = data.Length;
        UTF8Encoding encoding = new UTF8Encoding();
        byte[] buffer = encoding.GetBytes(data);
        response.OutputStream.Write(buffer, 0, data.Length);
        response.OutputStream.Flush();
    }
    response.Close ();
}

我尝试使用nancy独立应用程序,在那里我有同样的问题,所以我认为它的单声道有问题。

c# mono httplistener does not write http-headers

显然这是mono中的一个bug,仍然没有修复(bugzilla)。如预览示例所示:

P/1.1 200 OK
Content-Type: text/html
Server: Mono-HTTPAPI/1.0
Date: Thu, 03 Nov 2016 08:25:10 GMT
Content-Length: 9
Keep-Alive: timeout=15,max=100
test data

HTTP响应的前3个字符丢失。

所以问题更多的是一个不正确的http响应,然后只是缺少标头。据我所知,也没有变通办法,如果我错了,请纠正我。