0
我寫了一個簡單的httpserver,我打算與HttpRequest/Response進行交互。服務器收到請求和解析是好的,但是當我回信,我得到異常HttpWebRequest引發System.Net.WebException部分= ResponseStatusLine
System.Net.WebException: Der Server hat eine Protokollverletzung ausgeführt. Section=ResponseStatusLine
bei System.Net.HttpWebRequest.GetResponse()
我servercode這回寫到
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);
}
}
}
回報
HTTP/1.1 200 OK'13''10'Server: My custom Server'13''10'ContentLength: 0'13''10'Connection: Close'13''10''13''10'
你是對的,我錯過了。但它仍然給我例外 – Firo
@Firo:你可以爲服務器和客戶端提供一個簡短的*完整*程序嗎?有什麼理由不使用'HttpListener',出於興趣? –
1)我計劃在託管的linux上運行它,並擔心HttpListener沒有得到很好的支持,或者需要一些額外的安全措施。 2)如何創建自己的http服務器的基本示例看起來非常簡單(2頁代碼),並且具有可用屬性的ProcessGETRequest(...)'而不是HttpListenerRequest,其中包含許多僅適用於某些特殊情況的屬性。 – Firo