2009-10-17 35 views
0

msdn給我們這個例子來檢索發佈數據。是否可以異步獲取HttpListenerRequest的發佈數據?

public static void ShowRequestData (HttpListenerRequest request) 
{ 
    if (!request.HasEntityBody) 
    { 
     Console.WriteLine("No client data was sent with the request."); 
     return; 
    } 
    System.IO.Stream body = request.InputStream; 
    System.Text.Encoding encoding = request.ContentEncoding; 
    System.IO.StreamReader reader = new System.IO.StreamReader(body, encoding); 
    if (request.ContentType != null) 
    { 
     Console.WriteLine("Client data content type {0}", request.ContentType); 
    } 
    Console.WriteLine("Client data content length {0}", request.ContentLength64); 

    Console.WriteLine("Start of client data:"); 
    // Convert the data to a string and display it on the console. 
    string s = reader.ReadToEnd(); 
    Console.WriteLine(s); 
    Console.WriteLine("End of client data:"); 
    body.Close(); 
    reader.Close(); 
    // If you are finished with the request, it should be closed also. 
} 

source

我檢查StreamReader類和有沒有開始... ...結束方法。這是否意味着Post數據不能異步檢索?或者在HttpListener的回調來之前它已經被檢索到了?

我不希望獲得一個線程失速而慢後一個數據塊的用武之地。

什麼是正確的異步方式做到這一點? (或者實際上是在ReadToEnd的正確嗎?)

感謝

[R

回答

0

而不是使用StreamReader你可以在你的輸入流調用Stream.BeginRead的。


更新:這裏有一個流使用的BeginRead的例子:

class State 
{ 
    public Stream Stream { get; set; } 
    public byte[] Buffer { get; set; } 
} 

class Program 
{ 
    private const int ChunkSize = 1024; 
    static void Main(string[] args) 
    { 
     var stream = new FileStream("test.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 
     var state = new State { Stream = stream, Buffer = new byte[ChunkSize] }; 
     var ar = stream.BeginRead(state.Buffer, 0, state.Buffer.Length, Callback, state); 
     while (!ar.IsCompleted) 
     { 
      Thread.Sleep(10); 
     } 
    } 

    static void Callback(IAsyncResult ar) 
    { 
     var state = (State)ar.AsyncState; 
     var bytesRead = state.Stream.EndRead(ar); 
     if (bytesRead > 0) 
     { 
      byte[] buffer = new byte[bytesRead]; 
      Buffer.BlockCopy(state.Buffer, 0, buffer, 0, bytesRead); 
      // Do something with the received buffer. 
      Console.Write(Encoding.UTF8.GetString(buffer)); 

      state.Stream.BeginRead(state.Buffer, 0, state.Buffer.Length, Callback, state); 
     } 
     else 
     { 
      // reached the end of the stream 
      state.Stream.Dispose(); 
     } 
    } 
} 
+0

太棒了!謝謝...! – Toad 2009-10-17 14:38:02