daisuke_nomura の日記

Android プログラマーな鉄道ファンのブログ

Windows Phone 8でHttpWebRequest/Responseを使う

はじめに
 @daisuke_nomuraです。Windows 8ではHTTP通信の際、HttpClientクラスあるいはHttpWebRequest/Responseクラスを利用します。Windows Phone 8ではHttpClientはなく(代わりに?)WebClientクラスがあります。HttpWebRequest/Responseは多少機能が異なるものの、Windows 8と同じ感覚で利用できます。

 

次に

  Windows Phone 8のHTTPWebRequest/Responseクラスには、Windows 8と比べるとメソッドが足りません。Windows 8では

HttpWebRequest

と書くとHTTP通信をしてhttp://hogehoge.comが得られますが、Windows Phone 8ではSDKをインストールしただけではHttpWebRequestクラスにGetResponseAsyncメソッドがありません。

 

Bcl Asyncのインストール

 HttpWebRequestクラスでGetResponseAsyncメソッドを使う場合、Bcl AsyncというNuGetパッケージをインストールしましょう。Visual Studio 2012でプロジェクトの上で右クリック→NuGetパッケージの管理を押し下げし、オンラインを選びます。「安定版パッケージのみ」を「リリース前のパッケージを含める」に変更した上で検索ボックスに「Bcl Async」と入力してください。

f:id:daisuke_nomula:20121126194234p:plain

見つかったら、インストールボタンを押すだけで完了です。以上で、HttpWebRequestクラスでGetResponseAsyncメソッドが使えるようになりました。

 

HTTPリクエスト・レスポンス
 では、通信してみましょう。try-catchで囲むのをお忘れなく。

Bcl Async追加後のHttpWebRequest

 

Windows 8とWindows Phone 8のHttpWebRequestクラスの違い
 Windows Phone 8ではWindows 8とは異なり、HttpWebRequestクラスにAllowAutoRedirectプロパティがある上、UserAgentプロパティを任意のものに変更できます。 
 AllowAutoRedirectは、Webサーバが300~を返してきた時の動作を変更できます。req.AllowAutoRedirect = false;とすると、 Webサーバが300~を返してきた時にリダイレクトしません。

 また、Windows 8ではUserAgentを変更したい場合はHttpClientクラスを利用するしかありませんでしたが、Windows Phone 8ではreq.UserAgent = "hogehoge";とするだけでUserAgentを「hogehoge」に変更できます。 

 

さいごに
 Windows 8のHttpWebRequestクラスでUserAgentを変更できないのが残念ですね。HTTP通信でUserAgentを変更したい場合、Windows 8ではHttpClientクラス、Windows Phone 8ではHttpWebRequest/Responseクラスを使う必要があり、コードが共通化できません。

 

参考
Using async await without .NET Framework 4.5 - BCL Team Blog - Site Home - MSDN Blogs
http://blogs.msdn.com/b/bclteam/archive/2012/10/19/using-async-await-without-net-framework-4-5.aspx 
NuGet Gallery Async for .NET Framework 4, Silverlight 4 and 5, and Windows Phone 7.5 1.0.12-beta
http://nuget.org/packages/Microsoft.Bcl.Async