HttpClientクラスを使用して、Webサイトのデータを取得する単純な作業を行うWPFアプリケーションです。
コンソール・アプリケーションで、HttpClientクラスを使用する例は、よく紹介されていますが、WPFアプリケーションでの使用する例は、あまり見かけません。
問題なく動作するサンプル・アプリケーションを見ると、なんてことのないコードですが、意識していないと、マルチスレッド・プログラミングのデッドロックが発生するコードを書いてしまいがちです。
HttpClient詳解、或いはAsyncOAuthのアップデートについて(33ページ)
プログラムの作成
新しいプロジェクトを作成します。
WPFアプリを選択し、次へをクリックします。
それぞれのファイルに、以下のコードを入力します。※MainWindow.xamlコードの最初の行は、自動生成されたコードを、そして、MainWindow.xaml.csコードのnamespaceも自動生成されたものを使用してください。
<Window x:Class="GetHtmlDocument.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="GetHtmlDocument" Height="250" Width="350">
<DockPanel>
<DockPanel DockPanel.Dock="Top">
<Button DockPanel.Dock="Right" Click="Button_Click">Browse</Button>
<TextBox Name="address_bar">http://google.co.jp</TextBox>
</DockPanel>
<TextBox Name="htmlDocument">TextBox</TextBox>
</DockPanel>
</Window>
using System.Net.Http;
using System.Threading.Tasks;
using System.Windows;
namespace GetHtmlDocument
{
/// <summary>
/// MainWindow.xaml の相互作用ロジック
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private async void Button_Click(object sender, RoutedEventArgs e)
{
// Browseボタンをクリック
var value = await GetAsync();
htmlDocument.Text = value;
}
private async Task<string> GetAsync()
{
var client = new HttpClient();
var result = await client.GetStringAsync("http://google.co.jp");
return result;
}
}
}
MainWindow.xaml.cs内の、ボタン・クリック・イベントが、 asyncにしてあることに注意してください(重要)。また、UIのアドレスが入力されているテキストボックスは、コードに反映されていない(未実装)ことにも注意してください。
実行結果
プログラム実行後、「Browse 」ボタンを押すと、ソースコード(おそらく、ソースコードを表示したものと同じテキスト)が、テキスト・ボックスに表示されます。
UIのテキストボックスからURIを取得する
少しコードを変更し、UIに設置したテキストボックスからURIを取得し、Webデータを取得するように、コードを変更します。xamlコードは、変更ありません。xaml.csコードの修正です。
using System;
using System.Net.Http;
using System.Threading.Tasks;
using System.Windows;
namespace GetHtmlDocument
{
/// <summary>
/// MainWindow.xaml の相互作用ロジック
/// </summary>
public partial class MainWindow : Window
{
Uri uri ; // URIを格納する変数
public MainWindow()
{
InitializeComponent();
}
private async void Button_Click(object sender, RoutedEventArgs e)
{
// URIを取得
uri = new Uri(address_bar.Text);
if (uri != null) // uriが指定されていなければ何もしない
{
// Browseボタンをクリック
var value = await GetAsync();
htmlDocument.Text = value;
}
}
private async Task<string> GetAsync()
{
using (var client = new HttpClient())
{
var result = await client.GetStringAsync(uri);
return result;
}
}
}
}
shift-jisエンコードページに対応させる方法については、以下のサイトが参考になります。