C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: WebメソッドからのHTTP通信時のデフォルトプロキシ


(過去ログ 134 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■79128 / inTopicNo.1)  WebメソッドからのHTTP通信時のデフォルトプロキシ
  
□投稿者/ きぃ (1回)-(2016/03/10(Thu) 09:05:21)

分類:[.NET 全般] 

いつもお世話になっております。
現在C#のWebサービスとしてイントラネットワーク内に用意しているWebメソッドの処理で、
外部ネットワークにある画像データを取得するためHTTP通信を実行しています。

この時にリクエストがタイムアウトになるので調べていたところ、
イントラネットワークのセキュリティによって指定されたプロキシを経由しないリクエストは遮断されていることによるものだとわかりました。

ただしそのプロキシを使用できるようにする設定はIE上では既に設定済みであり(自動構成スクリプトpacファイルを指定)、
ブラウザ上からは画像データへのアクセスは問題なくできています。
またHTTP通信部分を抜き出したデスクトップアプリケーションからもアクセス可能なことは確認しています。

上記のことからWebメソッドとして実行された時だけIE設定がうまく利用できていないのではないかと予想しています。
もちろんメソッド内でプロキシサーバのアドレスとポートを直接指定すれば解消されるのですが、
できればそのような対処方法ではなく、IE設定を引き継ぎたいと考えています。

ちなみに該当通信処理ですが、HttpWebRequestクラスのインスタンスを生成し、
配下のProxyオブジェクトにSystem.Net.WebRequest.GetSystemWebProxy()を指定しています。
(Webで調べる限り通常はIE設定が有効となるということだったので、Proxyをセットしないパターンも試してみましたが変化ありませんでした)

何か情報をお持ちの方がいらっしゃいましたらアドバイスをお願いいたします。

以下にソースコードを抜粋します
System.Net.SerivcePointManager.DefaultConnectionLimit = 256;
System.Uri downloadurl = new System.Uri("ImageDataURL");
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(downloadurl);
webRequest.Timeout = 10000;
webRequest.ReadWriteTimeout = 10000;

webRequest.Proxy = System.Net.WebRequest.GetSystemWebProxy();
//webRequest.Proxy = new WebProxy("172.31.10.100:11080");  このように直打ちすればアクセスは可能

WebResponse res = webRequest.GetResponse();



引用返信 編集キー/
■79130 / inTopicNo.2)  Re[1]: WebメソッドからのHTTP通信時のデフォルトプロキシ
□投稿者/ WebSurfer (858回)-(2016/03/10(Thu) 13:07:01)
No79128 (きぃ さん) に返信

デスクトップアプリ => 外部 Web サーバー

は OK で、

ブラウザ (IE ?) => イントラの Web サーバー (Web サービス) => 外部 Web サーバー

はダメということですよね?

Web サービスというのは IIS で動いている ASP.NET がホストしているのでしょうか? 

そうだとすると、想像ですが(空想に近いかも)、ワーカープロセスでは IE のプロキ
シ設定が引き継げないということではないかと思います。
引用返信 編集キー/
■79132 / inTopicNo.3)  Re[2]: WebメソッドからのHTTP通信時のデフォルトプロキシ
□投稿者/ Hongliang (419回)-(2016/03/10(Thu) 13:17:04)
単にIISユーザのIEでは設定されていないってだけの話じゃないですかね。

構成ファイルのdefaultProxy/proxy/@scriptLocationで自動構成スクリプトを指定できるらしいですが
https://msdn.microsoft.com/ja-jp/library/sa91de1e.aspx
web.configでも使用可能かどうかは(そもそもscriptLocationが有効かどうかも)分かりません。
引用返信 編集キー/
■79133 / inTopicNo.4)  Re[1]: WebメソッドからのHTTP通信時のデフォルトプロキシ
□投稿者/ とっちゃん (333回)-(2016/03/10(Thu) 13:17:48)
No79128 (きぃ さん) に返信
> この時にリクエストがタイムアウトになるので調べていたところ、
> イントラネットワークのセキュリティによって指定されたプロキシを経由しないリクエストは遮断されていることによるものだとわかりました。
>
> ただしそのプロキシを使用できるようにする設定はIE上では既に設定済みであり(自動構成スクリプトpacファイルを指定)、
> ブラウザ上からは画像データへのアクセスは問題なくできています。
> またHTTP通信部分を抜き出したデスクトップアプリケーションからもアクセス可能なことは確認しています。
>
Webサーバー上の該当するWebサービスが動作するアカウントで確認しましたか?

IE の設定は、アカウントに紐づいていますので、別のアカウントで設定してあっても
それを参照することはありません。

簡単なチェック方法としては、
1.ログイン可能なアカウントをサーバーマシンに用意してそのアカウントでプロキシーを設定&動作確認しておく
2.Webサービスを1のアカウントで動作するように一時的に切り替える。
3.導通確認を行う。

でできます。
これでうまくいっているということであれば、Webサービスの動くアカウント上で設定されていないだけということになるので
自動構成スクリプトを「ログインすることのない」サービス向けのアカウントでセットアップできるようにするか
Webサービス側で個別に設定(自身でやってるパターン)するかのどちらかになります。

> 上記のことからWebメソッドとして実行された時だけIE設定がうまく利用できていないのではないかと予想しています。
> もちろんメソッド内でプロキシサーバのアドレスとポートを直接指定すれば解消されるのですが、
> できればそのような対処方法ではなく、IE設定を引き継ぎたいと考えています。
>
ということで、Webサービス側にはそもそも引継ぎできるような設定が存在していない

ということだと思います。


自分ならどうするか?ですが、サービス向けのアカウントに自動設定とかあまりお勧めしたくないので
web.config などにプロキシー設定情報を持たせておき
実行時はそれをみて、コメントアウトした部分を利用するようにすると思います。
> webRequest.Proxy = System.Net.WebRequest.GetSystemWebProxy();
> //webRequest.Proxy = new WebProxy("172.31.10.100:11080"); このように直打ちすればアクセスは可能
のコメント側の段取りのようにします。


引用返信 編集キー/
■79137 / inTopicNo.5)  Re[3]: WebメソッドからのHTTP通信時のデフォルトプロキシ
□投稿者/ きぃ (2回)-(2016/03/10(Thu) 15:03:03)
>>WebSurfer様、Hongliang様、とっちゃん様
さっそくのお返事ありがとうございます。
ご指摘頂いた点について改めて確認してみました。


>>WebSurfer様
>>デスクトップアプリ => 外部 Web サーバーは OK で、
>>ブラウザ (IE ?) => イントラの Web サーバー (Web サービス) => 外部 Web サーバー
>>はダメということですよね?
>>Web サービスというのは IIS で動いている ASP.NET がホストしているのでしょうか? 
→わかりづらくて申し訳ありません。
正確に言うと次のような状態です。
・デスクトップアプリ(問題となっているWebサーバ上で実行) => 外部 Web サーバー :OK
・ブラウザ (IE) => 外部 Web サーバー:OK
・イントラの Web サーバー (Web サービス) => 外部 Web サーバー:NG


>>Hongliang様
>>単にIISユーザのIEでは設定されていないってだけの話じゃないですかね。
→勉強不足で申し訳ありません。
とっちゃん様からもご指摘頂いているように
確かに私がブラウザ上で設定していると思っているものと
Webサービスが実行時に参照するものとは別物ということのようですね。


>>とっちゃん様
>>簡単なチェック方法としては、
>>1.ログイン可能なアカウントをサーバーマシンに用意してそのアカウントでプロキシーを設定&動作確認しておく
>>2.Webサービスを1のアカウントで動作するように一時的に切り替える。
>>3.導通確認を行う。
→2の手順がよくわからなかったのでひとまず次のようなことを試してみました。
1の確認を行った後、そのままのログイン状態でIIS画面上から該当Webサービスを「参照」。
開かれるIE画面(http://localhost/〜)に表示されている該当Webメソッドを呼び出す。

以上の操作では疎通できませんでした。
この状態では少なくとも1のユーザアカウントで設定したIE設定が参照されていると考えてよいのでしょうか。
それともHongliang様がおっしゃられているようなIISユーザ?のIE設定でしょうか。
引用返信 編集キー/
■79138 / inTopicNo.6)  Re[4]: WebメソッドからのHTTP通信時のデフォルトプロキシ
□投稿者/ とっちゃん (334回)-(2016/03/10(Thu) 15:41:04)
No79137 (きぃ さん) に返信
> >>とっちゃん様
> >>簡単なチェック方法としては、
> >>1.ログイン可能なアカウントをサーバーマシンに用意してそのアカウントでプロキシーを設定&動作確認しておく
> >>2.Webサービスを1のアカウントで動作するように一時的に切り替える。
> >>3.導通確認を行う。
> →2の手順がよくわからなかったのでひとまず次のようなことを試してみました。
> 1の確認を行った後、そのままのログイン状態でIIS画面上から該当Webサービスを「参照」。
> 開かれるIE画面(http://localhost/〜)に表示されている該当Webメソッドを呼び出す。
>
> 以上の操作では疎通できませんでした。
> この状態では少なくとも1のユーザアカウントで設定したIE設定が参照されていると考えてよいのでしょうか。
> それともHongliang様がおっしゃられているようなIISユーザ?のIE設定でしょうか。

1のアカウントは、IISやWebサービスの標準のアカウントとは別のものです。
なので、そこで何をやってもIISや Webサービスには影響しません。

で、2の手順を何とかしないと、サービスの動くアカウントが変わらないので何をやっても
それに意味が出てきません。

で、そのあたりについてはまずは偽装(ASP.NET 偽装 で検索)について学習してもらうのが一番かな。

ここで半端な説明を聞くより専門的に解説してるページを見るほうがよっぽどわかりやすいし速いです。

引用返信 編集キー/
■79139 / inTopicNo.7)  Re[4]: WebメソッドからのHTTP通信時のデフォルトプロキシ
□投稿者/ 魔界の仮面弁士 (668回)-(2016/03/10(Thu) 15:51:44)
ほぼ、他の方の回答と被る内容ではありますが:

No79137 (きぃ さん) に返信
> →2の手順がよくわからなかったので
IIS 管理ツールから対象の[アプリケーション プール]を選択し、
[詳細設定]からプロセス モデルの ID を、作成したカスタムアカウントに
指定してみてください。(当方未確認です)

config で割り当てるならこのあたりかな。
https://msdn.microsoft.com/ja-jp/library/cc465566.aspx
https://msdn.microsoft.com/ja-jp/library/cc402114.aspx



> この状態では少なくとも1のユーザアカウントで設定したIE設定が参照されていると考えてよいのでしょうか。

IE のプロキシ設定は、レジストリの
 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings
にユーザ単位で保持されていたと思います。ですから、
デスクトップに USER1 でログオンした場合は、USER1 に対する設定で動作し、
デスクトップに USER2 でログオンした場合は、USER2 に対する設定で動作します。
https://support.microsoft.com/ja-jp/kb/819961


HKEY_CURRENT_USER とは、HKEY_USERS\.DEFAULT と HKEY_USERS\何某 を結合したものですが、
IIS が利用する既定のアカウント設定であれば、プロキシ設定は未設定のままでしょう。


プロキシ設定を施したアカウントを用意し、それを IIS の実行アカウントにするのも
一つの手ではありますが、web.config で指定するか、または既に試されているように、
明示的に WebProxy を Proxy プロパティに割り当てるのが良いと思います。
引用返信 編集キー/
■79140 / inTopicNo.8)  Re[4]: WebメソッドからのHTTP通信時のデフォルトプロキシ
□投稿者/ WebSurfer (859回)-(2016/03/10(Thu) 16:10:48)
No79137 (きぃ さん) に返信
> ・デスクトップアプリ(問題となっているWebサーバ上で実行) => 外部 Web サーバー :OK
> ・ブラウザ (IE) => 外部 Web サーバー:OK
> ・イントラの Web サーバー (Web サービス) => 外部 Web サーバー:NG

一番上と 2 番目のケースでは、デスクトップアプリも IE も PC にログインしたユー
ザーのアカウントで動かしているはず。なので、そのユーザーの IE のプロキシの設定
によってプロキシ経由でアクセスするので OK になっているのでしょう。

問題の最後のケースで Web サービスを動かしているのは何ですか? 先の私のレスで
聞いた質問(質問には答えてくださいね)、

> Web サービスというのは IIS で動いている ASP.NET がホストしているのでしょうか?

が Yes であれば IIS のワーカープロセスのアカウント(IIS7 の場合デフォルトで Network
Service, IIS7.5 以降は https://technet.microsoft.com/ja-jp/library/ee886292.aspx 参照
してください)なのでユーザーの IE のプロキシ設定は引き継げなくて(プロキシ経由のアクセ
スにならなくて)NG になったのだと思います。

ワーカープロセスのアカウントを変えるとか余計なことはしないで(セキュリティの問題他予期
しない問題が多々出ると思いますので)、

> //webRequest.Proxy = new WebProxy("172.31.10.100:11080"); このように直打ちすればアクセスは可能

ということであれば、そのようにすることをお勧めします。"172.31.10.100:11080" というのを
ハードコーディングしたくなければ web.config の appSettings を使うなどの手段があります。
引用返信 編集キー/
■79142 / inTopicNo.9)  Re[5]: WebメソッドからのHTTP通信時のデフォルトプロキシ
□投稿者/ きぃ (3回)-(2016/03/10(Thu) 16:30:52)
>>とっちゃん様、魔界の仮面弁士様
お返事ありがとうございます。
サービスの認証設定から「ASP.NET偽装」を有効にして該当アカウントを紐づけた場合、
及びアプリケーションプールのプロセスモデルIDを変更した場合いずれも疎通できるようになりました。
繰り返しご指摘いただいた通りの原因でした。

ちなみに参考までに教えて頂きたいのですが、
とっちゃん様から回答頂いた【自動構成スクリプトを「ログインすることのない」サービス向けのアカウントでセットアップする】という方法は
pacファイル内のスクリプトを変更して対応するという認識であっていますでしょうか?
その場合、具体的な実装方法などで参考にできるような情報をご教示頂けないでしょうか。

度々の質問となり恐れ入りますが何卒よろしくお願いいたします。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -