現役当時に開発した .NetのXML Webサービスを使ったパッケージソフトがあります。リタイアした今もサポート対応をしているのですが プロキシを使ってWeb接続している場合 Webサービスに接続できないとの不具合の指摘がありました。
なんせこのシステム パッケージソフトのため 顧客に伺い 現地の環境で直接テストすることは、できません。そこでプロキシサーバーを立ち上げ再現実験行うことにしました。また客先に提供するシステムは あまりに多くの情報をクライアントに見せてしまうのは セキュリティ的に若干疑問なことからエラーが起きても
・『インターネット環境が認識できない』
・『サーバーに接続失敗した』
この2つの情報しか表示していません。
今となれば せめてシステムが通知するエラーコードぐらいは表示しておけば、もう少し早く原因が特定できたような気がします。
愚痴はこれぐらいにして、実際にプロキシサーバーを立てて実験してみます。
BlackJumboDogで試す。
- Windowsにインストールできるサーバーソフトで 窓の杜から ダウンロードしました(msi形式)。
各サーバーソフトの設定方法など詳しい説明は、ここのBlackJumboDogのプルダウンメニューに載っています。 - 右下の通知領域に表示されるBlackJumboDogのアイコンを右クリックしBLACKJUMBODOGの画面を開きます。
ドキュメントの『5分でできるプロキシサーバ』に従い プロキシサーバーを設定します。 - 早速 問題のプログラムを実行してみましたが 全く支障なく実行できます。やはり想像したとおり、指摘の現象は全てのプロキシで起こる現象ではなさそうです。
Squidで試す。
先日POSTした方法で構築した Squidを使って実験しました。
- 問題のプログラムを実行します。
結果はインターネットとの接続は確認できるのですが Webサービスとの接続には失敗します。これだ!! - MSのサポートページによると
通常、標準的なデスクトップ アプリケーションから使用される .NET ランタイムでは、Microsoft Internet Explorer 用に設定されているデフォルトのプロキシ設定が使用されます。Web サービスが存在する Web サイトを Internet Explorer で閲覧できる環境では、プロキシ設定がユーザー プロファイル内の格納場所から取得されるため、.NET ランタイムで呼び出しを行うために構成を変更する必要はありません。
とあります。ということは Proxy越えであっても ブラウザで Webサービスが見えれば 何も特別な処理無しで デスクトップアプリケーションから Webサービスに接続できるということです。
念のために ブラウザから Webサービスのサイト(http://www.nandakanda.co.jp/hogehoge.asmx)にアクセスすると 開発当時良く見ていた Webサービスのメソッド表示画面が見えます。つまり クライアントから Webサービスのサイトは見える環境にあることがわかりました。
- いよいよ エラーの詳細をメッセージボックスで表示してプログラムを実行しました。
結果は HTTPエラー:417
417を調べると ここに 『Expectヘッダによる拡張が失敗。』とあります。どうも 100-Continueのリクエストがプロキシで断られ 結果Webサービスに接続できない状態になっているようです。さて 100-Continue って?? 要はWebRequestのプロトコルで・・.NetのWebRequestではデフォルトで100-Continueが付いてしまいます。(ここ参照) - ところで Squidの 100-Continueの扱いをみると ここにあるように squid.confで明示的に ignore_expect_100 on と記述しないと 100 Continueのリクエストは受付ない設定になっています。試しに squid.confに ignore_expect_100 on の 一行を追加すると 417は出ず 正常終了!!!
- さすがに客先のプロキシ設定を変えてもらうわけには行かないのでプログラムを修正して対応します。
ここを参考に 最初のWebRequestの前に次の行を追加して 100-Continueなしで WebRequestを行うことにします。
System.Net.ServicePointManager.Expect100Continue = false;これで 不具合対応 完了!!!!
参考URL
http://www.forest.impress.co.jp/library/software/blackjmbdog/
http://www.sapporoworks.ne.jp/spw/
http://www.sapporoworks.ne.jp/spw/?page_id=581
http://support.microsoft.com/default.aspx?scid=kb;ja;307220#EKADAAA
http://jumperson.hatenablog.com/entry/2013/06/25/221202
http://d.hatena.ne.jp/tkuro/20110208/1297181393
http://www.squid-cache.org/Doc/config/ignore_expect_100/
http://www.codeproject.com/Articles/94235/The-request-failed-with-HTTP-status-Expectatio