2010-10-24 459 views
0

我在本地機器上創建了一個簡單的HTTP客戶端/服務器應用程序,但我不知道爲什麼在服務器上觸發了ListenerCallback;然而,當投擲「網絡異常EndGetContext沒有完成:?無法連接到客戶端上刪除服務器」任何想法,這裏的代碼使用HttpWebRequest.GetRequestStream時無法連接到遠程服務器

class Server 
{ 
    static void Main(string[] args) 
    { 
     NonblockingListener(new string[] {"http://192.168.0.55:5432/"}); 
    } 

    public static void NonblockingListener(string[] prefixes) 
    { 
     HttpListener listener = new HttpListener(); 
     foreach (string s in prefixes) 
     { 
      listener.Prefixes.Add(s); 
     } 
     listener.Start(); 
     IAsyncResult result = listener.BeginGetContext(new AsyncCallback(ListenerCallback), listener);  
     Console.WriteLine("Waiting for request to be processed asyncronously."); 
     result.AsyncWaitHandle.WaitOne(); 
     Console.WriteLine("Request processed asyncronously."); 
     listener.Close(); 
    } 

    public static void ListenerCallback(IAsyncResult result) 
    { 
     HttpListener listener = (HttpListener)result.AsyncState; 
     // Call EndGetContext to complete the asynchronous operation. 

     HttpListenerContext context = listener.EndGetContext(result); 
     HttpListenerRequest request = context.Request; 
     Stream reader = request.InputStream; 


     HttpListenerResponse response = context.Response; 

     string responseString = "<HTML><BODY> Hello World!</BODY></HTML>"; 
     byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString); 

     response.ContentLength64 = buffer.Length; 
     System.IO.Stream output = response.OutputStream; 
     output.Write(buffer, 0, buffer.Length); 

     output.Close(); 
    } 


} 


    class Client 
{ 
    public static void Main() 
    { 
     // Create a request using a URL that can receive a post. 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://192.168.0.55:5432"); 

     request.UserAgent = "linkToShare - HTTPWebRequest"; 
     request.Method = "POST"; 
     // Create POST data and convert it to a byte array. 
     string postData = "data data data data."; 
     byte[] byteArray = Encoding.UTF8.GetBytes(postData); 
     request.ContentType = "application/x-www-form-urlencoded"; 
     request.ContentLength = byteArray.Length;   
     Stream dataStream = request.GetRequestStream(); 
     dataStream.Write(byteArray, 0, byteArray.Length); 
     dataStream.Close(); 
     WebResponse response = request.GetResponse(); 
     Console.WriteLine(((HttpWebResponse)response).StatusDescription); 
     dataStream = response.GetResponseStream(); 
     StreamReader reader = new StreamReader(dataStream); 
     string responseFromServer = reader.ReadToEnd(); 
     Console.WriteLine(responseFromServer); 
     reader.Close(); 
     dataStream.Close(); 
     response.Close(); 
    } 

} 

回答

0

與您的代碼的問題是,在服務器中,你在呼喚。EndGetContext方法,將設置的WaitHandle,並立即關閉服務器它有任何時間發送響應之前

這裏是你的代碼稍加修改

服務器:

class Program 
{ 
    private static ManualResetEvent _waitHandle = new ManualResetEvent(false); 

    static void Main() 
    { 
     NonblockingListener(new string[] { "http://+:5432/" }); 
    } 

    public static void NonblockingListener(string[] prefixes) 
    { 
     using (var listener = new HttpListener()) 
     { 
      foreach (string s in prefixes) 
      { 
       listener.Prefixes.Add(s); 
      } 
      listener.Start(); 
      var result = listener.BeginGetContext(new AsyncCallback(ListenerCallback), listener); 
      Console.WriteLine("Waiting for request to be processed asyncronously."); 

      // Block here until the handle is Set in the callback 
      _waitHandle.WaitOne(); 
      Console.WriteLine("Request processed asyncronously."); 
      listener.Close(); 
     } 
    } 

    public static void ListenerCallback(IAsyncResult result) 
    { 
     var listener = (HttpListener)result.AsyncState; 
     var context = listener.EndGetContext(result); 

     var response = context.Response; 
     string responseString = "<HTML><BODY>Hello World!</BODY></HTML>"; 
     byte[] buffer = Encoding.UTF8.GetBytes(responseString); 
     response.ContentLength64 = buffer.Length; 
     response.OutputStream.Write(buffer, 0, buffer.Length); 
     // Finished sending the response, now set the wait handle 
     _waitHandle.Set(); 
    } 
} 

客戶:

class Program 
{ 
    static void Main(string[] args) 
    { 
     using (var client = new WebClient()) 
     { 
      client.Headers[HttpRequestHeader.UserAgent] = "linkToShare - HTTPWebRequest"; 
      var valuesToPost = new NameValueCollection 
      { 
       { "param1", "value1" }, 
       { "param2", "value2" }, 
      }; 
      var result = client.UploadValues("http://127.0.0.1:5432", valuesToPost); 
      Console.WriteLine(Encoding.UTF8.GetString(result)); 
     } 
    } 
} 
+0

我在這兩個客戶端/服務器端複製你的確切代碼。 client.UploadValues給了我這個WebException {「無法將數據寫入傳輸連接:現有連接被遠程主機強制關閉。」} – mustafabar 2010-10-24 09:33:34

+0

服務器是否引發異常?查看事件日誌。 – 2010-10-24 09:36:24

+0

我注意到服務器在客戶端繼續執行UploadValues之前仍然關閉 – mustafabar 2010-10-24 09:57:41

相關問題