HttpWebRequest の使用例 ~ 簡単に非同期 HTTP リクエストを送る

HttpWebRequest クラスを利用して、非同期の HTTP リクエストを送るサンプルコードを示します。

using System;
using System.Drawing;
using System.IO;
using System.Net;
using System.Text;
using System.Windows.Forms;


public class MainWindow : Form {


     Button     _Button;
     Label     _Label;


     public MainWindow() {

          //set up a button.
          _Button = new Button();
          _Button.Text = "OK";
          _Button.Size = new Size(75,20);
          _Button.Location = new Point(10, 10);

          _Button.Click += new EventHandler(OnButtonClicked);

          //set up a label.
          _Label = new Label();
          _Label.Text = "Click...";
          _Label.Size = new Size(1024, 800);
          _Label.Location = new Point(10, 40);
          _Label.BackColor = Color.Black;
          _Label.ForeColor = Color.LightGreen;

          // set up this program.
          Text = "AsyncWebReq Test Application.";
          
          Controls.Add(_Button);
          Controls.Add(_Label);
          
     }


     /// 
     /// Main
     ///


     public static void Main() {

          Application.Run( new MainWindow() );

     }


     ///
     /// OnButtonClicked
     /// - Event Handler for Button Clicked Event.
     ///


     void OnButtonClicked(object sender, EventArgs e) {

          // Show a status.
          _Label.Text = "Requesting...";

          //HTTP request.
          HttpWebRequest wreq = 
               (HttpWebRequest) WebRequest.Create(
                    "http://keicode.com/");

          AsyncCallback BeginGetResponseCallBack = new AsyncCallback(
               ProcessGetResponseCallback);

          wreq.BeginGetResponse(BeginGetResponseCallBack, wreq);
          
          
     }


     ///
     /// Notified when Web Request Completed.
     ///


     void ProcessGetResponseCallback(IAsyncResult ar) {

          HttpWebRequest req = (HttpWebRequest) ar.AsyncState;

          WebResponse wrep = req.GetResponse();
          Stream s = wrep.GetResponseStream();

          Byte[] buff = new Byte[4096];
          int iread = 0;
          StringBuilder sb = new StringBuilder();

          //reading stream...
          while((iread = s.Read(buff, 0, buff.Length)) > 0) {

               sb.Append(Encoding.Default.GetString(buff, 0, iread));

          }
          
          _Label.Text = sb.ToString();
          
     }


}

makefile は次の通りです。

CSC = csc.exe

TARGETNAME=asyncwebreq
SOURCE_FILE=$(TARGETNAME).cs

OUTDIR=.\chk

all: "$(OUTDIR)\$(TARGETNAME).exe"

"$(OUTDIR)" :
    if not exist "$(OUTDIR)" mkdir "$(OUTDIR)"


CSC_OPT=\
	/nologo\
	/target:winexe\
	/out:$(OUTDIR)\$(TARGETNAME).exe\
	/doc:$(OUTDIR)\$(TARGETNAME).xml\
	/debug+\
	/debug:full\
	/optimize-\
	/warn:4


$(OUTDIR)\$(TARGETNAME).exe: "$(OUTDIR)" $(SOURCE_FILE)
	$(CSC) $(CSC_OPT) $(SOURCE_FILE)

非同期のリクエストとは?

「非同期」 というものに意外と不慣れな方もいらっしゃるのではないかと思いますので、 念のため補足しておきます。ご存知の方には特に目新しい話題はないと思いますので、 他のページでもご覧ください (笑)

まず、非同期を理解するために同期処理は何かということを説明します。

例えば、ある時点で処理を開始します。そしてその処理が終了するまで待ってから次の処理を行う場合、 同期処理といいます。一方、ある処理を開始し、その処理が終了(あるいは途中の進捗レポートがある時点) まで、 別の処理を行い、処理が終わった時点で通知を受けて、その結果を利用する場合を非同期処理といいます。

今回の例で言えば、ボタンを押した時点で HTTP リクエスト送信を開始して、ボタンのイベントハンドラを抜けます。 そして、HTTP レスポンスを受け取った時点でコールバックを受けて、その結果を使います (ここではレスポンスを読み込み出力しています).

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Web/DB プログラミング徹底解説