2012-01-23 73 views
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' 

回答

1

嗯,這是非常可疑入手:

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

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

+0

你是對的,我錯過了。但它仍然給我例外 – Firo

+0

@Firo:你可以爲服務器和客戶端提供一個簡短的*完整*程序嗎?有什麼理由不使用'HttpListener',出於興趣? –

+0

1)我計劃在託管的linux上運行它,並擔心HttpListener沒有得到很好的支持,或者需要一些額外的安全措施。 2)如何創建自己的http服務器的基本示例看起來非常簡單(2頁代碼),並且具有可用屬性的ProcessGETRequest(...)'而不是HttpListenerRequest,其中包含許多僅適用於某些特殊情況的屬性。 – Firo

相關問題