ROMANCE DAWN for the new world

Microsoft Azure を中心とした技術情報を書いています。

プロキシ環境下で Web API を呼び出す

プロキシ サーバーを経由してクラウド上の Web API を呼び出す方法をまとめておきます。

プロキシ環境下において、HttpWebRequest や HttpClient を使って通常通りに Web API を呼び出すと、HTTP ステータスコードの 407(Proxy Authentication Required)が返されます。そのため、プロキシ サーバーの資格情報(ユーザー名とパスワード)を設定してから、Web API を呼び出す必要があります。

インターネット オプションで設定したプロキシ サーバーの IPアドレスやポートは、WebRequest クラス の DefaultWebProxy プロパティに設定されています。ここに Credentials プロパティがあるので、資格情報を設定します。

private void Button_Click(object sender, RoutedEventArgs e)
{
	// プロキシ サーバーの資格情報をセット
	WebRequest.DefaultWebProxy.Credentials = new NetworkCredential("UserName", "Password");

	// HttpWebRequest による Web API 呼び出し
	var request = WebRequest.Create(new Uri("http://xxx.azurewebsites.net/api/values")) as HttpWebRequest;
	request.Method = "GET";
	request.Accept = "application/json";
	var response = request.GetResponse() as HttpWebResponse;
	using (var stream = response.GetResponseStream())
	using (var reader = new StreamReader(stream, Encoding.UTF8))
	{
		var responseContent = reader.ReadToEnd();
	}
}
private async void Button_Click2(object sender, RoutedEventArgs e)
{
	// プロキシ サーバーの資格情報をセット
	WebRequest.DefaultWebProxy.Credentials = new NetworkCredential("UserName", "Password");

	// HttpClient による Web API 呼び出し
	using (var client = new HttpClient())
	{
		var response = await client.GetAsync("http://xxx.azurewebsites.net/api/values");
		result = await response.Content.ReadAsStringAsync();
		response.EnsureSuccessStatusCode();
	}
}

WebRequest.DefaultWebProxy は Static なプロパティです。上記のコードでは、ボタンクリック イベントで毎回資格情報を設定していますが、ロード イベントなどで1回だけ資格情報を設定する方法もあります。

ちなみに、WCF サービスを呼び出す場合も、同じ方法でプロキシ サーバーの資格情報を設定できます。

private void Button_Click(object sender, RoutedEventArgs e)
{
	// プロキシ サーバーの資格情報をセット
	WebRequest.DefaultWebProxy.Credentials = new NetworkCredential("UserName", "Password");

	// WCF による Web サービス 呼び出し
	var binding = new BasicHttpBinding();
	var remoteAddress = "http://xxx.azurewebsites.net/Service1.svc";
	var channel = new ChannelFactory<IService1>(binding, remoteAddress); 
	var proxy = channel.CreateChannel();
	result = proxy.GetData();
}

アプリとしては、事前に資格情報を設定させておく、もしくは 407 が返されたらログイン画面で資格情報を入力させるなどの対応が考えられます。