2011-07-29 2 views
0

最初のメソッドでボタンをクリックしようとすると、forループ内の非同期http要求が作成されていますが、パラメータを非同期コールバック関数に渡すことができません。 私は何かしたい、POSTメソッドを使用してforループ内のIDを送信したい。HttpWebRequest AsyncCallbackパラメータの問題

void Button3Click(object sender, EventArgs e) 
    {    
     for(int i = Convert.ToInt32(startno3.Text); i<Convert.ToInt32(endno3.Text); i++) {     
      ASCIIEncoding encoding=new ASCIIEncoding(); 
      string postData="id=1";     
      qstr3 = encoding.GetBytes(postData);     

      HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost/ornek/1.php"); 
      if(key1.Text!="") { 
       request.Headers.Add("Cookie", "PHPSESSID=" + key1.Text);      
      } 
      request.Method = "POST"; 
      request.ContentType="application/x-www-form-urlencoded"; 
      request.ContentLength = data.Length; 
      IAsyncResult asyncResult = request.BeginGetResponse(new AsyncCallback(EndScanFeeds), request);  
     } 
    } 

    public void EndScanFeeds(IAsyncResult result) { 
     HttpWebRequest request = null; 
     HttpWebResponse response = null; 
     Stream stream = null; 
     StreamReader streamReader = null; 
     try { 
      request = (HttpWebRequest)result.AsyncState; 
      response = (HttpWebResponse)request.EndGetResponse(result); 
      stream = response.GetResponseStream(); 
      streamReader = new StreamReader(stream); 
      string feedData = streamReader.ReadToEnd(); 
      response.Close(); 
      stream.Close(); 
      streamReader.Close(); 
      MessageBox.Show(feedData); 

     } 
     catch(Exception ex) { 
      throw(ex); 
     } 
     finally { 
      if(response != null) 
       response.Close(); 
      if(stream != null) 
       stream.Close(); 
      if(streamReader != null) 
       streamReader.Close(); 
     } 
    } c 

答えて

0

あなたはHttpWebRequestの(あなたがそれを設定した後qstr3で何もしていない)へのクエリ文字列パラメータとしてIDを追加する必要があります。

ContentTypeとContentLengthを設定している間は、実際のコンテンツは渡していません。

しかし、気になるのは、(潜在的に)多くの単純な非同期HttpWebRequestsを並行して実行することです。かなりの数がある場合、私は悪いことが起こり始めると思います。

正しいアプローチであるかどうかを検討してください。一度に1つ以上のIDを取得するように1.phpを変更できますか?

0

なぜ関数にパラメータを渡すことができないのですか? BeginGetResponseの2番目のパラメータにrequestを使用しています。その代わりに任意のカスタムオブジェクトを渡し、パラメータと参照の両方を保持し、HttpWebRequestにキャストする代わりにresult.AsyncStateをそのオブジェクト型にキャストすることができます。

実際にIDを送信する必要がある場合は、非同期request.BeginGetResponse操作の前に要求ストリームを取得する必要があります。たとえば、要求からGetRequestStream()を取得し、そこにデータを書き込む(または非同期操作として)。