読者です 読者をやめる 読者になる 読者になる

がりらぼ

WindowsRuntimeの応援ブログ

HttpClientを認証プロキシに対応させる

.Net4.5あたりからインターネットからデータをダウンロードしたり、するようなアプリにはHttpClientがよく使われているとおもわれます。(よく知らないですけど

すると問題になってくるのが認証プロキシの問題です。
Windowsデバイスは社内や学内のプロキシーネットワーク下にて使われることが多いと思いますがアプリが認証プロキシに対応していないとネットと接続することができません。

Microsoft純正アプリはそこら辺はちゃんとしていて、MailやSkypeなどは認証プロキシ下でも難なく使えます。

しかしFacebooktwitterなど、非MSアプリは認証プロキシを通りません。

Windowsストアアプリは業務や教育にこそ普及すべきなので認証プロキシに対応できるようにしましょう。

プロキシはHttpClientHandlerクラスで設定します。
なぜかstaticでもないのにHttpClientHandlerにてプロキシを一度設定すると以降のHttpClientによるコネクションはすべてプロキシ設定が適応されるという便利な感じになっています。

なのでプロキシ認証をしていないからネットに接続できないというエラーを検知したら以下のコードを実行しましょう。

CredentialPickerOptions credPickerOptions = new CredentialPickerOptions();
            credPickerOptions.Message = "認証情報を入力してください";
            credPickerOptions.Caption = "プロキシネットワークに接続します";
            credPickerOptions.TargetName = "target";
            credPickerOptions.AlwaysDisplayDialog = true;
            credPickerOptions.AuthenticationProtocol = AuthenticationProtocol.Basic;
//認証ピッカーを起動
            var picker = await CredentialPicker.PickAsync(credPickerOptions);

//Handlerに設定
//ProxyはOSで設定したプロキシサーバーURLとポートが取得可能
//認証情報は取得できなかったのでPickerによって取得
            HttpClientHandler handler = new HttpClientHandler();
            handler.Proxy = WebRequest.DefaultWebProxy;
            handler.Proxy.Credentials = new NetworkCredential(picker.CredentialUserName, picker.CredentialPassword);

これを設定すれば、以降どのようにHttpClientでコネクションしても接続できます。

 HttpClient client = new HttpClient();
 var s = await client.GetStringAsync("http://garicchi.com");
 MessageDialog dialog = new MessageDialog(s);
 await dialog.ShowAsync();

f:id:garicchi:20140215154455p:plain