2012-09-05 20 views
6

を呼び出します。私が理解する限り、これはrequest.GetRequestStream()への呼び出しをasychronous.BeginGetRequestStream()に変更する必要があることを意味します。私はthisの例を見てきましたが、このシナリオにそれをどのように適用するのか分かりません。助けてもらえますか?の実装は、HttpWebRequest非同期は、私はそれを非同期にする必要があり、私はこのコード</p> <pre><code>using (var stream = new StreamWriter(request.GetRequestStream(), Encoding)) stream.Write(body.ToString()); </code></pre> <p>を持って

+0

使用している.NETのバージョンは? .NET 4.5では簡単です。 –

+0

それは4.私はまだ4.5を使用することはできません。 –

+0

まだ4で可能ですか? –

答えて

12

ドキュメントが良い例(http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.begingetrequeststream(v=vs.100).aspx)を持つ:

using System; 
using System.Net; 
using System.IO; 
using System.Text; 
using System.Threading; 

class HttpWebRequestBeginGetRequest 
{ 
    private static ManualResetEvent allDone = new ManualResetEvent(false); 
public static void Main(string[] args) 
{ 
    // Create a new HttpWebRequest object. 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.contoso.com/example.aspx"); 

    request.ContentType = "application/x-www-form-urlencoded"; 

    // Set the Method property to 'POST' to post data to the URI. 
    request.Method = "POST"; 

    // start the asynchronous operation 
    request.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), request); 

    // Keep the main thread from continuing while the asynchronous 
    // operation completes. A real world application 
    // could do something useful such as updating its user interface. 
    allDone.WaitOne(); 
} 

private static void GetRequestStreamCallback(IAsyncResult asynchronousResult) 
{ 
    HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState; 

    // End the operation 
    Stream postStream = request.EndGetRequestStream(asynchronousResult); 

    Console.WriteLine("Please enter the input data to be posted:"); 
    string postData = Console.ReadLine(); 

    // Convert the string into a byte array. 
    byte[] byteArray = Encoding.UTF8.GetBytes(postData); 

    // Write to the request stream. 
    postStream.Write(byteArray, 0, postData.Length); 
    postStream.Close(); 

    // Start the asynchronous operation to get the response 
    request.BeginGetResponse(new AsyncCallback(GetResponseCallback), request); 
} 

private static void GetResponseCallback(IAsyncResult asynchronousResult) 
{ 
    HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState; 

    // End the operation 
    HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asynchronousResult); 
    Stream streamResponse = response.GetResponseStream(); 
    StreamReader streamRead = new StreamReader(streamResponse); 
    string responseString = streamRead.ReadToEnd(); 
    Console.WriteLine(responseString); 
    // Close the stream object 
    streamResponse.Close(); 
    streamRead.Close(); 

    // Release the HttpWebResponse 
    response.Close(); 
    allDone.Set(); 
} 
+0

GetResponseCallBackから元の呼び出し元に何か(たとえばレスポンス文字列)を返すようにこのコードを変更するには、AsyncCallBackではシグネチャにvoid戻り値の型が必要ですか? –

+0

これをどうやって作るのか分かりませんでした。 –

0

あなたは、このコードによって理解することができます。

このプログラムでは、非同期呼び出しを介してデータを渡すRequestStateクラスと、インターネットリソースに対して非同期要求を実装するClientGetAsyncクラスの2つのクラスを使用します。

RequestStateクラスは、要求を処理する非同期メソッドへの呼び出しのあいだ、要求の状態を保持します。これには、リソースへの現在の要求と応答で受け取ったストリーム、インターネットリソースから現在受信したデータを含むバッファ、および完全な応答を含むStringBuilderを含むWebRequestおよびStreamインスタンスが含まれます。 AsyncCallbackメソッドがWebRequest.BeginGetResponseで登録されている場合、RequestStateは状態パラメータとして渡されます。

ClientGetAsyncクラスは、インターネットリソースに対する非同期要求を実装し、結果の応答をコンソールに書き込みます。次のリストで説明するメソッドとプロパティが含まれています。

allDoneプロパティには、要求の完了を通知するManualResetEventクラスのインスタンスが含まれます。

Main()メソッドはコマンドラインを読み取り、指定されたインターネットリソースの要求を開始します。 WebRequest wreqとRequestState rsを作成し、BeginGetResponseを呼び出して要求の処理を開始し、allDone.WaitOne()メソッドを呼び出して、コールバックが完了するまでアプリケーションが終了しないようにします。応答がインターネットリソースから読み取られた後、Main()はコンソールにそれを書き込み、アプリケーションは終了します。

showusage()メソッドは、コマンドラインの例をコンソールに書き込みます。コマンドラインにURIが指定されていない場合、Main()によって呼び出されます。

RespCallBack()メソッドは、インターネット要求に対して非同期コールバックメソッドを実装します。インターネットリソースからの応答を含むWebResponseインスタンスを作成し、応答ストリームを取得してから、ストリームから非同期でデータの読み取りを開始します。

ReadCallBack()メソッドは、応答ストリームを読み取るための非同期コールバックメソッドを実装しています。インターネットリソースから受信したデータをRequestStateインスタンスのResponseDataプロパティに転送し、その後、データが返されなくなるまでレスポンスストリームの別の非同期読み取りを開始します。すべてのデータが読み取られると、ReadCallBack()は応答ストリームをクローズし、allDone.Set()メソッドを呼び出してレスポンス全体がResponseDataに存在することを示します。

using System; 
using System.Net; 
using System.Threading; 
using System.Text; 
using System.IO; 

// The RequestState class passes data across async calls. 
public class RequestState 
{ 
    const int BufferSize = 1024; 
    public StringBuilder RequestData; 
    public byte[] BufferRead; 
    public WebRequest Request; 
    public Stream ResponseStream; 
    // Create Decoder for appropriate enconding type. 
    public Decoder StreamDecode = Encoding.UTF8.GetDecoder(); 

    public RequestState() 
    { 
     BufferRead = new byte[BufferSize]; 
     RequestData = new StringBuilder(String.Empty); 
     Request = null; 
     ResponseStream = null; 
    }  
} 

// ClientGetAsync issues the async request. 
class ClientGetAsync 
{ 
    public static ManualResetEvent allDone = new ManualResetEvent(false); 
    const int BUFFER_SIZE = 1024; 

    public static void Main(string[] args) 
    { 
     if (args.Length < 1) 
     { 
     showusage(); 
     return; 
     } 

     // Get the URI from the command line. 
     Uri httpSite = new Uri(args[0]); 

     // Create the request object. 
     WebRequest wreq = WebRequest.Create(httpSite); 

     // Create the state object. 
     RequestState rs = new RequestState(); 

     // Put the request into the state object so it can be passed around. 
     rs.Request = wreq; 

     // Issue the async request. 
     IAsyncResult r = (IAsyncResult) wreq.BeginGetResponse(
     new AsyncCallback(RespCallback), rs); 

     // Wait until the ManualResetEvent is set so that the application 
     // does not exit until after the callback is called. 
     allDone.WaitOne(); 

     Console.WriteLine(rs.RequestData.ToString()); 
    } 

    public static void showusage() { 
     Console.WriteLine("Attempts to GET a URL"); 
     Console.WriteLine("\r\nUsage:"); 
     Console.WriteLine(" ClientGetAsync URL"); 
     Console.WriteLine(" Example:"); 
     Console.WriteLine("  ClientGetAsync http://www.contoso.com/"); 
    } 

    private static void RespCallback(IAsyncResult ar) 
    { 
     // Get the RequestState object from the async result. 
     RequestState rs = (RequestState) ar.AsyncState; 

     // Get the WebRequest from RequestState. 
     WebRequest req = rs.Request; 

     // Call EndGetResponse, which produces the WebResponse object 
     // that came from the request issued above. 
     WebResponse resp = req.EndGetResponse(ar);   

     // Start reading data from the response stream. 
     Stream ResponseStream = resp.GetResponseStream(); 

     // Store the response stream in RequestState to read 
     // the stream asynchronously. 
     rs.ResponseStream = ResponseStream; 

     // Pass rs.BufferRead to BeginRead. Read data into rs.BufferRead 
     IAsyncResult iarRead = ResponseStream.BeginRead(rs.BufferRead, 0, 
     BUFFER_SIZE, new AsyncCallback(ReadCallBack), rs); 
    } 


    private static void ReadCallBack(IAsyncResult asyncResult) 
    { 
     // Get the RequestState object from AsyncResult. 
     RequestState rs = (RequestState)asyncResult.AsyncState; 

     // Retrieve the ResponseStream that was set in RespCallback. 
     Stream responseStream = rs.ResponseStream; 

     // Read rs.BufferRead to verify that it contains data. 
     int read = responseStream.EndRead(asyncResult); 
     if (read > 0) 
     { 
     // Prepare a Char array buffer for converting to Unicode. 
     Char[] charBuffer = new Char[BUFFER_SIZE]; 

     // Convert byte stream to Char array and then to String. 
     // len contains the number of characters converted to Unicode. 
     int len = 
     rs.StreamDecode.GetChars(rs.BufferRead, 0, read, charBuffer, 0); 

     String str = new String(charBuffer, 0, len); 

     // Append the recently read data to the RequestData stringbuilder 
     // object contained in RequestState. 
     rs.RequestData.Append(
      Encoding.ASCII.GetString(rs.BufferRead, 0, read));   

     // Continue reading data until 
     // responseStream.EndRead returns –1. 
     IAsyncResult ar = responseStream.BeginRead( 
      rs.BufferRead, 0, BUFFER_SIZE, 
      new AsyncCallback(ReadCallBack), rs); 
     } 
     else 
     { 
     if(rs.RequestData.Length>0) 
     { 
      // Display data to the console. 
      string strContent;     
      strContent = rs.RequestData.ToString(); 
     } 
     // Close down the response stream. 
     responseStream.Close();   
     // Set the ManualResetEvent so the main thread can exit. 
     allDone.Set();       
     } 
     return; 
    }  
} 
関連する問題

 関連する問題