ネットワーク接続のトラブルシューティングとデバッグ (Windows ランタイム アプリ)

[ この記事は、Windows ランタイム アプリを作成する Windows 8.x および Windows Phone 8.x 開発者を対象としています。Windows 10 向けの開発を行っている場合は、「最新のドキュメント」をご覧ください]

ネットワークの問題は、アプリが応答しなくなったり、クラッシュしたりする原因となります。対処不可能なダイアログ ボックスや紛らわしいエラー メッセージがユーザーに表示されることもあります。こうしたエラーは、ネットワーク スタックのどこで発生してもおかしくないので、トラブルシューティングとデバッグが困難な場合があります。

影響が及ぶ範囲

ネットワークの問題は、ネットワークを (ソケットなどで) 直接的に、または (ネットワークを使う API などで) 間接的に使うすべての Windows ランタイム アプリに関係します。通常はネットワーク エラーの発生条件をアプリに代わりオペレーティング システムが自動的に処理し、それができない場合、アプリでエラーに対処できるのが理想です。

適切なネットワーク機能の選択

Windows ランタイム アプリでネットワークにアクセスするためには、特定のネットワーク分離機能がアプリのマニフェストで有効にされている必要があります。これらの機能は通常、アプリの開発時に Microsoft Visual Studio 2013 を使って構成します。これらの機能は、Windows によって強制的に適用されます。適切なネットワーク機能が設定されていないと、ネットワーク アクセスが遮断される可能性があります。

したがって、ネットワークの問題をトラブルシューティングする際はまず、そのアプリに対して適切なネットワーク機能が構成されていることを確認する必要があります。

ネットワーク機能 説明

privateNetworkClientServer

  • これは通常、プライベート "プロファイル" であり、ローカル サブネットとループバック機能が含まれます。エンタープライズ設定では、さらにローカル サブネットと Active Directory サイト/ドメインも含まれます。

  • この設定を有効にするということは、自宅または職場のプライベート ネットワークでの使用を想定したアプリであることを意味します。

internetClient

  • インターネット上の (必要な場合、プロキシを介しての) サービスとの通信を許可します。通信はすべてクライアント側から開始する必要があるという点で、これは internetClientServer 機能に似ています。クライアントが、他のホストからの接続をリッスンすることはできません。ループバックやローカル サブネットへの接続は許可されません。

internetClientServer

  • インターネット上の (必要な場合、プロキシを介しての) サービスとの通信を許可します。この設定では、インターネットからの入力方向の接続/到達と、クライアント側から開始される出力方向の操作とが両方とも許可されます。

  この機能は、入力方向の通信を可能にしますが、必ずしも通信がうまくいくとは限りません。企業ネットワークのエッジに置かれたプロキシやファイアウォールによって入力方向の通信が遮断される可能性はあります。
 

proximity

物理的に近接 (最大約 30 cm) する 2 つのマシンが、Windows.Networking.Proximity 名前空間の機能を使って相互に対話できます。

 

アプリに必要なネットワーク アクセスが明らかになったら、適切なネットワーク機能を設定する必要があります。この作業をしないと、ネットワーク アクセスがブロックされます。

ループバックによるネットワーク アクセスを有効にする方法と、ネットワーク分離の問題をトラブルシューティングする方法について詳しくは、「ループバックを有効にする方法とネットワーク分離のトラブルシューティングを行う方法」をご覧ください。

ネットワーク ステータスの変化への対応

Windows 8.1、Windows Phone 8.1、Windows Server 2012 R2 は、新しいネットワークを検出すると、新しい接続先を自動的に追加します。たとえば、3G ネットワークを使ってデータをストリーミングしているユーザーが Wi-Fi ネットワークの範囲に入ると、必要に応じてその新しい接続先がアプリから利用できるようになります。

モバイル デバイスでは、ネットワークはつながったり途切れたりを繰り返すものです。自宅や職場の中で 3G ネットワークが使えないこともあります。Wi-Fi なら利用できるかもしれませんが、その Wi-Fi も、家や職場から離れれば使うことはできません。それどころか、一切のネットワークが利用できないこともあります。このようにネットワークが変化する (つながったり途切れたり、利用できない) 状況は、Wi-Fi とモバイル ブロードバンド ネットワークの普及によって、ますます一般的になってきています。接続が新しいネットワークに自動的に、そしてスムーズに切り替わるとは限りません。アプリの介入が必要になる場合もあります。Windows 8.1、Windows Phone 8.1、Windows Server 2012 R2 の既定のポリシーでは、従量制課金接続よりも制限のないネットワークが、また、低速なネットワークよりも高速なネットワークが選ばれるようになっています。

ネットワーク アクセスは、ネットワークの変化の影響に絶えずさらされます。アプリは、ネットワーク ステータス変更通知 (onNetworkStatusChanged) を受け取るための登録を行うことで、このようなネットワークの変化を知ることができますアプリは、使っていた接続が利用できなくなった (エラーが表示された) 場合、次のいずれかの対処を行う必要があります。

  • 操作を再試行し、 もし失敗した場合は、別の NetworkStatusChanged 通知を待ちます。
  • ネットワーク コストをチェックして、別のネットワークへの接続を試みます。

基本的なトラブルシューティングのガイダンス

Windows ランタイム アプリに求められる対応を次に示します。

  • ネットワーク エラーが発生したら、状況に応じて操作を再試行します。たとえば、認証に失敗した場合には操作を再試行しません。これに対し、通信中のワイヤレス ネットワークがつながらなくなった場合は、別のワイヤレス ネットワークが利用できる可能性があるので操作を再試行します。操作を再試行するだけで、多くのエラーは解消されます。再試行の際は、「ネットワーク ステータスの変化への対応」に記載したガイドラインに従ってください。

  • 必ず非同期 API を使うようにし、ブロック呼び出しが UI スレッドに存在しないようにします。ネットワーク操作で完了までに時間がかかったりエラーが発生したとしても、アプリが応答しなくなるのは好ましくありません。Windows ランタイムの非同期的な特性を、同期的な動作で押さえつけてしまうことのないように注意してください。

  • エラー処理モデルは事前に計画します。エラー情報をユーザーに対しどのように公開するかを、アプリの設計時によく検討してください。たとえば、ダウンロード時のネットワーク エラーの表示用として、Internet Explorer には、タスク指向のダイアログ ボックスが採用されています。また、Outlook には控えめなネットワーク インジケーターが、Communicator には、"UI 全体を差し替える" 方法が採用されています。スローされた例外やエラーは捕捉してください。それぞれのエラー文字列を把握したうえで、適宜ユーザーに通知します。

  • ネットワークの切断と再接続、中断と再開、ネットワークの切り替えなどの操作を行いながら、さまざまなネットワーク環境でアプリをテストします。

  • アプリをテストしていて、一見してわからないようなエラーが見つかった場合は、ETW トレースを有効にして、その問題についての詳しい情報を収集できます。

関連トピック

ネットワーク サポートの追加

ETW トレース

ネットワーク分離機能を構成する方法

ループバックを有効にする方法とネットワーク分離のトラブルシューティングを行う方法