Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# HttpWebRequest抛出System.Net.WebException节=ResponseStatusLine_C#_Http_Httpwebrequest_Httpwebresponse - Fatal编程技术网

C# HttpWebRequest抛出System.Net.WebException节=ResponseStatusLine

C# HttpWebRequest抛出System.Net.WebException节=ResponseStatusLine,c#,http,httpwebrequest,httpwebresponse,C#,Http,Httpwebrequest,Httpwebresponse,我编写了一个简单的httpserver,我计划与HttpRequest/Response进行交互。服务器得到请求,解析也很好,但当我写回请求时,会出现异常 System.Net.WebException: Der Server hat eine Protokollverletzung ausgeführt. Section=ResponseStatusLine bei System.Net.HttpWebRequest.GetResponse() 我的服务器代码写回 TcpClient

我编写了一个简单的httpserver,我计划与HttpRequest/Response进行交互。服务器得到请求,解析也很好,但当我写回请求时,会出现异常

System.Net.WebException: Der Server hat eine Protokollverletzung ausgeführt. Section=ResponseStatusLine
   bei System.Net.HttpWebRequest.GetResponse()
我的服务器代码写回

TcpClient client = ...;
_stream = _client.GetStream();


// make sure "\r\n" is used as line ending, because it may be different on different OS
_output = new StreamWriter(_stream, Encoding.UTF8) { NewLine = "\r\n" };

length = 0;
code = 200;
message = "OK";
_output.WriteLine("HTTP/1.1 " + code + " " + message);
_output.WriteLine("Server: My Server");
_output.WriteLine("ContentLength: " + length);
_output.WriteLine("Connection: " + (_keepAlive ? "Keep-Alive" : "Close"));
_output.WriteLine();
_output.Flush();
客户端代码

var request = (HttpWebRequest)WebRequest.Create("http://127.0.0.1:8080/foo");
request.KeepAlive = false;
request.ServicePoint.Expect100Continue = false;

using (var res = request.GetResponse())   // throws here
{
}
using (var client = new TcpClient())
{
    client.Connect(new IPEndPoint(IPAddress.Loopback, 8080));
    using (var stream = client.GetStream())
    {
        var writer = new StreamWriter(stream);
        writer.WriteLine("GET /foo HTTP/1.1");
        writer.WriteLine("HOST:127.0.0.1");
        writer.WriteLine("Connection:Close");
        writer.WriteLine();
        writer.Flush();

        var response = new StreamReader(stream).ReadToEnd();
        foreach (var c in response)
        {
            if (char.IsControl(c))
                Console.Write("'{0}'" , (int)c);
            else
                Console.Write(c);
        }
    }
}
有什么想法吗

更新:正如Jon提到的,第一个bug被删除了,但仍然不起作用

备用客户端代码

var request = (HttpWebRequest)WebRequest.Create("http://127.0.0.1:8080/foo");
request.KeepAlive = false;
request.ServicePoint.Expect100Continue = false;

using (var res = request.GetResponse())   // throws here
{
}
using (var client = new TcpClient())
{
    client.Connect(new IPEndPoint(IPAddress.Loopback, 8080));
    using (var stream = client.GetStream())
    {
        var writer = new StreamWriter(stream);
        writer.WriteLine("GET /foo HTTP/1.1");
        writer.WriteLine("HOST:127.0.0.1");
        writer.WriteLine("Connection:Close");
        writer.WriteLine();
        writer.Flush();

        var response = new StreamReader(stream).ReadToEnd();
        foreach (var c in response)
        {
            if (char.IsControl(c))
                Console.Write("'{0}'" , (int)c);
            else
                Console.Write(c);
        }
    }
}
返回

HTTP/1.1 200 OK'13''10'Server: My custom Server'13''10'ContentLength: 0'13''10'Connection: Close'13''10''13''10'

首先,这很可疑:

_output = new StreamWriter(_stream, Encoding.UTF8) { NewLine = "\n\r" };

我想你的意思是
\r\n
而不是
\n\r

你说得对,我没听清楚。但它仍然给了我机会exception@Firo:您能为服务器和客户端提供一个简短但完整的程序吗?出于兴趣,您是否有任何理由不使用
HttpListener
?1)我计划在托管linux上运行它,担心HttpListener没有得到很好的支持,或者需要一些额外的安全功能。2) 如何创建自己的http服务器的基本示例看起来非常简单(2页代码),并且具有
ProcessGETRequest(…)
具有可用属性,而不是HttpListenerRequest具有大量仅适用于某些特殊情况的属性。它与httplistener一起工作返回
HTTP/1.1 200 OK'13''10'内容长度:0'13''10'服务器:Microsoft HTTPAPI/1.0'13''10'日期:周二,2012年1月24日12:22:04 GMT'13''10'连接:关闭'13''10''13''10'
仍然不确定为什么我自己的服务器导致httprequest中的协议错误