デバイスとITの架け橋

Windows 8やWindows Phone、.NET Micro Framework、周辺デバイスに関する技術情報やVisual Studioによる組込み系開発など様々な話題を取り扱います

Windows 8 ストアアプリ - 非同期なWebアクセスコーディング

Windows 8 ストアアプリ - 非同期なWebアクセスコーディング

Rate This
  • Comments 3

WinRT APIでは非同期が導入されました。それに伴い、ファイルやネットアクセスなど時間がかかる処理は大抵の場合、メソッド名の最後にAsyncがついた、非同期メソッドになっています。

このポストでは、RESTなどで提供されているWebサービスへのアクセス方法を紹介します。例として、Twitterのアカウントのフォロワー情報を得るケース(今後OAuth認証が必要になりますが、2012年10月時点で許されている形式で紹介しますね)では、

http://api.twitter.com/1/statuses/followers/embedded_george.xml?cursor=-1

 というURLを要求すると、(太字の部分は調べたいTwitterアカウントのuser_name)、XML形式で該当するTwitterアカウントのフォロワーの最初の100人分がXMLで返ってきます。

これをWindows 8 ストアアプリで実行するには、System.Net名前空間のWebRequest、WebResponseを使います。

    var followerUri = new Uri("http://api.twitter.com/1/statuses/followers/" + target + ".xml?" + "cursor=" + cursor);
    WebRequest twitterReq = WebRequest.Create(followerUri);
    try
    {
        var twitterRes = await twitterReq.GetResponseAsync();
        using (var stream = twitterRes.GetResponseStream())
        {
            …
        }
    }
    catch (Exception ex)
    {
        …
    }

WebRequest.Createメソッドを使って、リクエストインスタンスを作るのは、従来通りです。リクエストからレスポンスを取り出すには、上のアンダーラインを引いたような形式で書いて、WebResponseインスタンス(twitterRes)を取り出します。
twitterResを取れれば、後はGetResponseStream()メソッドをコールして、ストリームを取り出し、データを操作することができます。もちろん、Headersプロパティから応答ヘッダーの内容も参照可能です。

ネット上で公開されているREST APIを使って何かアプリを作りたい、と思っている方、是非お試しを

  • たとえば msdn.microsoft.com/.../hh868221.aspx のサンプルにあるように、

    var twitterRes = await twitterReq.GetResponseAsync();

    としてしまってよいのでは?

  • 旧来の、APMパターンのBegin/Endの非同期メソッドしかない場合は、FromAsync()でラップしてTask<>を返すようにしてawaitを使い。Task<> XXXAsync()の形式で既に用意されている場合は、そっちを使うというのが良さそうな気がします。

    ちなみに、Azure Storage Clientは、旧来のAPMパターンのメソッドしか用意されていないので、FromAsync()でラップする必要がありますが、パラメータが多くて面倒です。

  • コメントでのご指摘の通りですね。GetResponseAsync()の方がシンプルだし、新しく用意されたメソッドを使用するべきでしょう。

    ということで、本文修正しておきました。念のため、修正前のコードをコメントに残しておきます。

    [修正前]

    var twitterRes = await Task.Factory.FromAsync<WebResponse>(twitterReq.BeginGetResponse, twitterReq.EndGetResponse, null);

Page 1 of 1 (3 items)
Leave a Comment
  • Please add 2 and 8 and type the answer here:
  • Post