WebMatrix 3: HttpClient を使う

執筆日時:

As promised in our last blog post we’re releasing Microsoft.Net.Http as a stable NuGet package today. Yep, that’s right: You can finally start using the portable HttpClient 2.1 in production!

Get /httpclient/rtm – 200 OK - .NET Blog - Site Home - MSDN Blogs

Microsoft BCL チームが HttpClient を NuGet で利用できるようにして、すでに2週間が経っていた。汎用性の高いこのネットワーククライアントクラスは .NETer の第二の故郷となり、人々はそれでリクエストを飛ばし、受け取り、そして死んでいった。

――こいつの何が便利なのかは諸兄の解説に譲るとして。

オラはこれを WebMatrix で使ってみるぞ!……正直 WebMatrix で使うべきものなのかはよくわからんが。

NuGet パッケージをインストール

f:id:daruyanagi:20130613203301p:plain

空のサイト(ASP.NET)を作成。

f:id:daruyanagi:20130613203324p:plain

“HttpClient”で検索して NuGet パッケージをインストール。これでした準備を完了。

とりあえず使ってみる

f:id:daruyanagi:20130613203552p:plain

Microsoft のトップページでも Get してみるかの。

@using System.Net.Http

@using (var downloader = new HttpClient()) { var response = downloader.GetAsync("http://microsoft.com/").Result; var content = response.Content.ReadAsStringAsync().Result; Page.Response = response; Page.Content = content; }

<!DOCTYPE html>

<html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <meta charset="utf-8" /> <title>マイ サイトのタイトル</title> <link href="~/favicon.ico" rel="shortcut icon" type="image/x-icon" /> </head> <body> <h1>Response</h1> <pre> @Page.Response </pre>

<h1>Content</h1> @Page.Content </body> </html>

f:id:daruyanagi:20130613203716p:plain

普通に使えた。WebClient のときよりも微妙にコードが長くなった気がするけど気にしない。今回は使えるかやってみるのが目標なので。

ちなみに @{ @using(){…} } の外側のカッコは省略できるけど(今回は省略して書いた)、変数のスコープを間違えやすいのでお勧めしない(今回の場合、var response がビューから呼べるような気がするけど呼べない)。

非同期にしてみる

f:id:daruyanagi:20130613204245p:plain

これだけではあんまり面白くないので、async/await も使ってみるかな。……で、それで気づいたのだけど、WebMatrix のシンタックスハイライタは async/await に対応していない。まぁ、困りはしないが……

@using System.Net.Http
@using System.Threading.Tasks

@{ var data = HogeAsync().Result; }

@functions { private async Task<dynamic> HogeAsync() { using (var downloader = new HttpClient()) { var response = await downloader.GetAsync("http://microsoft.com/"); var content = await response.Content.ReadAsStringAsync();

return new { Response = response, Content = content, }; } } }

<!DOCTYPE html>

<html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <meta charset="utf-8" /> <title>マイ サイトのタイトル</title> <link href="~/favicon.ico" rel="shortcut icon" type="image/x-icon" /> </head> <body> <h1>Response</h1> <pre> @data.Response </pre>

<h1>Content</h1> @data.Content </body> </html>

f:id:daruyanagi:20130613203716p:plain

結果は同じ。

まとめ

  • 普通に使える
  • でも、利点は感じない(ストアアプリなんかだったらバリバリ使うけど)
  • シンタックスハイライタが async/await に対応していなかった