System.Net.Http.HttpClient を使って接続する方法 (C#/VB と XAML を使った Windows ストア アプリ)

System.Net.Http 名前空間の HttpClient クラスを使って、Web サービスに GET 要求を送り、応答を取得します。

  System.Net.Http 名前空間と System.Net.Http.Headers 名前空間は、Windows の将来のバージョンでは Windows ストア アプリ用に使用できないことがあります。Windows 8.1 および Windows Server 2012 R2 以降、Windows ランタイム アプリでは代わりに、Windows.Web.Http 名前空間の Windows.Web.Http.HttpClient と、関連する Windows.Web.Http.Headers 名前空間および Windows.Web.Http.Filters 名前空間を使います。

System.Net.Http 名前空間のクラスでは、新しい HTTP アプリ用のプログラミング インターフェイスが提供されます。System.Net.Http 名前空間とそれに関連する名前空間には、ユーザーが HTTP 経由で新しい Web サービスを利用できるようにする HTTP クライアント コンポーネントが用意されています。

System.Net.Http.HttpClient クラスを使って、HTTP 経由で基本的な要求を送受信します。このクラスには、HTTP 要求を送り、URI で識別されるリソースから HTTP 応答を受け取るための基底クラスが用意されています。このクラスを使って、Web サービスに GET、PUT、POST、DELETE などの要求を送れます。これらの各要求は、非同期操作として送られます。

System.Net.Http.HttpResponseMessage クラスは、HTTP 要求から受け取った HTTP 応答メッセージを表します。HTTP メッセージは、IETF によって RFC 2616 で規定されています。

System.Net.Http.HttpContent クラスは、HTTP のエンティティ ボディとコンテンツ ヘッダーを表す基底クラスです。 ここでは、System.Net.Http.Http.Content は HTTP 応答を表すために使います。

必要条件

このトピックの次の例は、.NET Framework 4.5 を使って、C# で記述されています。このサンプルを理解するには、RFC 2616 で規定されている HTTP 要求に関する基本的な知識が役立ちます。

C#/VB と XAML を使った Windows ランタイム アプリで HTTP 要求を行う場合については、「Windows.Web.Http.HttpClient を使って HTTP サーバーに接続する方法」をご覧ください。C++ と XAML を使った Windows ランタイム アプリで HTTP 要求を行う場合については、「Windows.Web.Http.HttpClient を使って HTTP サーバーに接続する方法」と「XML HTTP Extended Request および IXMLHTTPRequest2 を使って接続する方法」をご覧ください。

JavaScript と HTML を使った Windows ランタイム アプリで HTTP 要求を行う場合については、「Web サービスへの接続 (HTML)」をご覧ください。

新しいプロジェクトを作る

  1. Microsoft Visual Studio 2013 を開き、[ファイル] メニューの [新しいプロジェクト] をクリックします。
  2. テンプレートの一覧で、[Visual C#] を選びます。
  3. そのセクションで [ストア アプリ] を選びます。
  4. そのセクションで [Windows アプリ] を選び、[新しいアプリケーション] を選びます。
  5. アプリケーションに HttpClientBasic という名前を付け、[OK] をクリックします。

ネットワーク アクセスを有効にする機能を設定する

アプリがプライベート ホーム ネットワーク、社内ネットワーク、インターネットにアクセスできるように、ネットワーク機能を設定する必要があります。このアプリでは、クライアントが Web サービスに接続するため、ネットワーク機能を有効にする必要があります。

System.Net.Http.HttpClient を使って別のコンピューター上の Web サービスに接続するアプリでは、ネットワーク機能を設定する必要があります。アプリがクライアントとしてインターネット上の Web サービスに接続するには、インターネット (クライアント) 機能が必要です。アプリがクライアントとしてホーム ネットワークまたは社内ネットワーク上の Web サービスに接続するには、プライベート ネットワーク (クライアントとサーバー) 機能が必要です。

Web サービスがアプリと同じコンピューター上で実行されている場合は、ループバック アクセスが必要になります。Microsoft Visual Studio 2012 で開発されたアプリは、ループバックの制限から除外済みとして自動的に登録されます。詳しくは、「ループバックを有効にする方法とネットワーク分離のトラブルシューティングを行う方法」をご覧ください。

ネットワーク アクセスについて詳しくは、「ネットワーク分離機能を構成する方法」をご覧ください。

Web サービスがローカル コンピューター上にある場合は、このサンプルに次の手順は必要ありません。これらの手順は、アプリがインターネット、プライベート ネットワーク、または社内ネットワーク上の Web サービスにアクセスする場合に、ネットワーク機能を設定するために必要です。

  1. Visual Studio 2012 を使って、package.appxmanifest ファイルを開きます。
  2. [機能] タブをクリックします。
  3. [インターネット (クライアント)] 機能と [プライベート ネットワーク (クライアントとサーバー)] 機能を選びます。
  4. マニフェスト ファイルを保存して閉じます。

XAML UI を追加する

  • このセクションでは、XAML でアプリのレイアウトを定義して、アプリ内の各オブジェクトのサイズと位置を指定します。 データを表示するためにコントロールとコンテンツを追加して、アプリの UI を完成させます。

    このサンプルでは、次を含む簡単な XAML UI 要素を使います。

    • ラベル用の TextBlock、入力 URI アドレス用の TextBox、非同期要求を開始する Button を含む水平方向の StackPanel
    • ラベル用の TextBlock と現在の状態用の TextBox を含む水平方向の StackPanel。この TextBox に、状態やエラー メッセージが表示されます。

    Web サービスから受け取った出力を表示する Grid。このサンプルでは、HTTP GET 操作の結果は、HTML マークアップを含むプレーンテキストとして表示されます。

    cs フォルダーを開きます。既にある blankPage.html ファイルを開き、ファイルの名前を MainPage.xaml に変えます。 次の UI 要素をこのファイルに追加します。

    
    <Page
        x:Class="HttpClientBasic.BlankPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:HttpClientBasic"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">
    
        <Grid Background="{StaticResource ApplicationPageBackgroundBrush}">
            <StackPanel Orientation="Vertical">
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="URI Address:" FontSize="16" Height="20"  Margin="15,0,0,0" />
                    <TextBox x:Name="InputAddress" Text="http://www.contoso.com" FontSize="16" Height="20" Margin="15,0,0,0" />
                    <Button Content="Start" Click="Start_Click" Margin="280,0,0,0" />
                </StackPanel>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="Status:" FontSize="16" Height="20" Margin="15,0,0,0" />
                    <TextBox x:Name="StatusText" Text="Idle" FontSize="16" Height="Auto" TextWrapping="Wrap" Margin="15,0,0,0" />
                </StackPanel>
                <Grid 
                    Grid.Column="1" Margin="15,0,0,0">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="*" />
                    </Grid.RowDefinitions>
                    <TextBlock x:Name="OutputView" FontSize="16" Height="Auto" Margin="15,0,0,0" TextWrapping="Wrap" />
                </Grid>    
            </StackPanel>
         </Grid>
    </Page>
    
    
    

HttpClient の作成、GET 要求の送信、応答の取得

次のコードでは、まず System.Net.Http.HttpClient オブジェクトを作成します。

  1. まず HttpClient オブジェクトを作成します。また、HttpClient オブジェクトの 2 つのプロパティの設定も行います。

    HttpClient.MaxResponseContentBufferSize プロパティの既定のサイズは、整数の最大サイズです。Web サービスからの応答としてアプリが受け付けるデータの量を制限するため、このプロパティにそれより小さい値を設定します。

    既定では、HttpClient オブジェクトによって、ユーザー エージェント ヘッダーが HTTP 要求と共に Web サービスに送られることはありません。Microsoft Web サーバーなど、一部の HTTP サーバーでは、クライアントから送られた HTTP 要求にユーザー エージェント ヘッダーが含まれている必要があり、ヘッダーが存在しない場合はエラーが返されます。そうしたエラーが発生しないように、HttpClient.DefaultRequestHeaders プロパティを使ってユーザー エージェント ヘッダーを追加します。

    cs フォルダーを開きます。MainPage.cs ファイルを開き、次のコードをファイルに追加します。

    
        private HttpClient httpClient;
    
        public BlankPage()
        {
            this.InitializeComponent();
            httpClient = new HttpClient();
            // Limit the max buffer size for the response so we don't get overwhelmed
            httpClient.MaxResponseContentBufferSize = 256000;
            httpClient.DefaultRequestHeaders.Add("user-agent", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)");
        }
    
    
    
  2. GET 要求を送り、応答を取得します。

    ほとんどの処理は、Start Button のクリック ハンドラーで行います。このボタンをクリックすると、StatusTextOutputView UI 要素のテキストが更新され、入力 URI アドレスを使って HTTP GET 要求が送られ、応答を待機します。エラーや例外が発生した場合は、その結果が StatusText UI 要素に表示されます。エラーが発生しなかった場合は、Web サービスからの応答が OutputView UI 要素に表示されます。

    C# や Visual Basic で await キーワードを使った場合、非同期的に GET 要求を送って応答を取得するコードは、この操作を同期的に行うコードと似ています。await キーワードは、メソッドが async として定義されている場合だけ使うことができます。

    Web サーバーから HTTP エラー状態コードが返された場合は、HttpResponseMessage.EnsureSuccessStatusCode メソッドによって例外がスローされます。 すべての例外に対して try/catch ブロックを使い、エラーが発生した場合は StatusText UI 要素に例外メッセージを出力します。try ブロックで、Web サービスから返された状態と応答を出力します。

    HttpResponseMessage.Content プロパティは、HTTP 応答の内容を表します。HttpContent.ReadAsStringAsync メソッドによって、非同期操作として HTTP の内容を文字列に書き込みます。 表示するために、返された HTML テキスト内のすべての <br> タグを改行に置き換えます。

    
            private async void Start_Click(object sender, RoutedEventArgs e)
            {
                try
                {
                    string responseBodyAsText;
                    OutputView.Text = "";
                    StatusText.Text = "Waiting for response ...";
    
                    HttpResponseMessage response = await httpClient.GetAsync(InputAddress.Text);
                    response.EnsureSuccessStatusCode();
    
                    StatusText.Text = response.StatusCode + " " + response.ReasonPhrase + Environment.NewLine;
                    responseBodyAsText = await response.Content.ReadAsStringAsync();
                    responseBodyAsText = responseBodyAsText.Replace("<br>", Environment.NewLine); // Insert new lines
                    OutputView.Text = responseBodyAsText;
                }
                catch (HttpRequestException hre)
                {
                    StatusText.Text = hre.ToString();
                }
                catch (Exception ex)
                {
                    // For debugging
                    StatusText.Text = ex.ToString();
                }
            }
    
    
    
    

    System.Net.Http 名前空間の HttpClient やそれに関連したクラスを使うアプリで大量のデータ (50 MB 以上) をダウンロードする場合は、既定のバッファリングは使わずに、ストリームによってダウンロードするようにします。既定のバッファリングを使うと、クライアントのメモリ使用量が非常に大きくなり、著しくパフォーマンスを損なう可能性があります。

    HttpClient クラスやそれに関連したクラスのメンバーによって無効な Uniform Resource Identifier (URI) が検出されると、UriFormatException がスローされます。この例外は、Windows ストア アプリでは利用できません。この例外をキャッチするには、FormatException の catch のステートメントを記述してください。

要約と次のステップ

このトピックでは、System.Net.Http.HttpClient クラスを使って Web サービスに GET 要求を送り、System.Net.Http.HttpResponseMessageSystem.Net.Http.HttpContent クラスを使って応答を取得する方法について説明しました。

HttpClientBasic のサンプル


using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;

// The Blank Page item template is documented at http://go.microsoft.com/fwlink/p/?linkid=234238

namespace HttpClientBasic
{
    /// <summary>
    /// An empty page that can be used on its own or navigated to within a Frame.
    /// </summary>
    public sealed partial class BlankPage : Page
    {
        private HttpClient httpClient;

        public BlankPage()
        {
            this.InitializeComponent();
            httpClient = new HttpClient();
            // Limit the max buffer size for the response so we don't get overwhelmed
            httpClient.MaxResponseContentBufferSize = 256000;
            httpClient.DefaultRequestHeaders.Add("user-agent", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)");
        }


        /// <summary>
        /// Invoked when this page is about to be displayed in a Frame.
        /// </summary>
        /// <param name="e">Event data that describes how this page was reached.  The Parameter
        /// property is typically used to configure the page.</param>
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
        }

        private async void Start_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                string responseBodyAsText;
                OutputView.Text = "";
                StatusText.Text = "Waiting for response ...";

                HttpResponseMessage response = await httpClient.GetAsync(InputAddress.Text);
                response.EnsureSuccessStatusCode();

                StatusText.Text = response.StatusCode + " " + response.ReasonPhrase + Environment.NewLine;
                responseBodyAsText = await response.Content.ReadAsStringAsync();
                responseBodyAsText = responseBodyAsText.Replace("<br>", Environment.NewLine); // Insert new lines
                OutputView.Text = responseBodyAsText;
            }
            catch (HttpRequestException hre)
            {
                StatusText.Text = hre.ToString();
            }
            catch (Exception ex)
            {
                // For debugging
                StatusText.Text = ex.ToString();
            }
        }
    }
}


System.Net.Http.HttpClient クラスと一緒に System.Net.Http.HttpClientHandler クラスを使って、HTTP 要求のオプションを設定できます。 詳しくは、「System.Net.Http.HttpClient ハンドラーを使う方法」をご覧ください。

関連トピック

その他のリソース
Web サービスへの接続
ネットワーク分離機能を構成する方法
Windows.Web.Http.HttpClient を使って HTTP サーバーに接続する方法
ループバックを有効にする方法とネットワーク分離のトラブルシューティングを行う方法
System.Net.Http.HttpClient 接続を保護する方法
System.Net.Http.HttpClient ハンドラーを使う方法
辞書/リファレンス
System.Net.Http
System.Net.Http.Headers
Windows.Web.Http
Windows.Web.Http.Filters
Windows.Web.Http.Headers
サンプル
HttpClient のサンプルに関するページ

 

 

表示:
© 2015 Microsoft