豚吐露@wiki
WebRequestでGETするとWebExceptionが発生する
最終更新:
Bot(ページ名リンク)
-
view
WebRequestでGETするとWebExceptionが発生する
Windows 7-64bit Professional
Visual Studio 2008 Professional
.Net Framework 3.5
C# 3.0
Visual Studio 2008 Professional
.Net Framework 3.5
C# 3.0
任意のサイトにSystem.Net.WebRequestを用いてGETを行おうとしたところ、例外が発生してGETできないという現象に陥った。(´・ω・`)
HTTP Statusも返って来ないし、通常のブラウザなら閲覧可能。
wget使っての取得も問題無し。
なのに、WebRequestはダメ。
wget使っての取得も問題無し。
なのに、WebRequestはダメ。
発生した例外はコレ。

『WebException』は分かるとして...『基礎になる接続が閉じられました: 接続が予期せずに閉じられました』って何!?Σ(´Д`;)
聞いた事もねーんですけど...orz

『WebException』は分かるとして...『基礎になる接続が閉じられました: 接続が予期せずに閉じられました』って何!?Σ(´Д`;)
聞いた事もねーんですけど...orz
と言う訳で、半日かけて原因が判明したのでφ(..*)メモメモ...
原因としては接続先Webサーバが使ってるセキュリティサービスが原因みたい。
今回に限って言うと、どうやら コイツ 。
今回に限って言うと、どうやら コイツ 。
こういうセキュリティサービスって怪しい接続が来るとHTTP Statusも返さんと強制的にHTTP接続を切断するみたい。
で、強制的に切断されると...こうなる。(´・ω・`)

で、強制的に切断されると...こうなる。(´・ω・`)

とりあえず、調査方法と結果を以下に書いて行こう。
まず、どうやっても取得できない。
『基礎になる接続が閉じられました』ってなんやねん!!って話。
ぐーぐる先生に聞いても大した情報は得られず...
『基礎になる接続が閉じられました』ってなんやねん!!って話。
ぐーぐる先生に聞いても大した情報は得られず...
仕方がないので色々調べていった。
まず対象URLからGETができんパターンが他に無いか?
とりあえず、ブラウザは大丈夫。『WebRequest』はダメ。じゃlinuxから『wget』は?ってぇと大丈夫だった。
なんでwgetは大丈夫なん?と思いつつ、今度はWindowsから『bitsadmin /transfer get』で試してみると...ダメ。
とりあえず、ブラウザは大丈夫。『WebRequest』はダメ。じゃlinuxから『wget』は?ってぇと大丈夫だった。
なんでwgetは大丈夫なん?と思いつつ、今度はWindowsから『bitsadmin /transfer get』で試してみると...ダメ。
意味が分からんと思いつつ、apache起動させて、同じように色んなトコからGETして、どんなAccessLogになるんか見てみたら...こんな感じになった。
- 192.168.1.1 - - [24/Dec/2015:01:23:45 +0900] "GET / HTTP/1.1" 200 491 "-" "Wget/1.15 (linux-gnu)"
- 192.168.1.2 - - [24/Dec/2015:02:23:45 +0900] "GET / HTTP/1.1" 200 491 "-" "-"
- 192.168.1.2 - - [24/Dec/2015:03:23:45 +0900] "HEAD / HTTP/1.1" 200 314 "-" "Microsoft BITS/7.5"
- 192.168.1.2 - - [24/Dec/2015:04:23:45 +0900] "GET / HTTP/1.1" 200 490 "-" "Microsoft BITS/7.5"
1行めはwget。2行目がWebRequest。3~4行目がbitsadmin。
次に、接続先のWebサーバから『wget -S』してみた。
どーせ古いIISでも使ってんだろ...って思っとったんじゃが...予想外に『Server: Scutum』という見慣れない文字が出てきちまった...
どーせ古いIISでも使ってんだろ...って思っとったんじゃが...予想外に『Server: Scutum』という見慣れない文字が出てきちまった...
$ wget -S http://www.hoge.go.jp/index.html
--2015-12-24 23:34:45-- http://www.hoge.go.jp/index.html Resolving www.hoge.go.jp (www.hoge.go.jp)... 29.29.29.29, 39.39.39.39 Connecting to www.hoge.go.jp (www.hoge.go.jp)|29.29.29.29|:80... connected. HTTP request sent, awaiting response... HTTP/1.1 200 OK Cache-Control: private,no-cache, no-store Pragma: no-cache Content-Length: 777 Content-Type: text/html Set-Cookie: ********************************************** path=/ X-UA-Compatible: IE=edge Date: Thu, 24 Dec 2015 01:02:03 GMT Server: Scutum Length: 777 [text/html] Saving to: ‘index.asp.1’ 100%[============================================================================================================>] 777 --.-K/s in 0.01s 2015-12-14 20:32:55 (56.4 KB/s) - ‘index.html’ saved [777/777]
『Scutum』ってなんなんすか?って思って
ぐぐった結果
...
ココ
にたどり着きました。
サービス内容を見ると、どうやらセキュリティのサービスらしいが、対象のホームページで拡張子がASPになってたりしてたんで、恐らく後ろで他のWebサーバ動かしといて、その手前でセキュリティ機能を提供する鯖かましとるんじゃろうね。
サービス内容を見ると、どうやらセキュリティのサービスらしいが、対象のホームページで拡張子がASPになってたりしてたんで、恐らく後ろで他のWebサーバ動かしといて、その手前でセキュリティ機能を提供する鯖かましとるんじゃろうね。
そう考えると、『基礎になる接続が閉じられました: 接続が予期せずに閉じられました』ってWebExceptionは、WebRequestからの接続を『怪しいトコからの接続だ!』って判断して強制的に切断しとるように思える。
じゃ、何が原因なんよ?wgetとか大したことしてねーよ。と思いつつApacheのaccess.log眺めてたら...
wgetってちゃんとUserAgent設定してるのね。※『Wget/1.15 (linux-gnu)』ってトコがUserAgent。
したら、WebRequsetにも、ちゃんとUserAgent設定してみるか...って設定してみたら...あっさり接続できた。(´Д`)
wgetってちゃんとUserAgent設定してるのね。※『Wget/1.15 (linux-gnu)』ってトコがUserAgent。
したら、WebRequsetにも、ちゃんとUserAgent設定してみるか...って設定してみたら...あっさり接続できた。(´Д`)
どうやら、scutumってサービスは、UserAgentが空だと怪しいトコからの接続だと判断してるみたいです。
『bitsadmin /transfer get』の方もUserAgent設定してあるみたいじゃが...
直前にHEADで要求してんのがマズイんか、UserAgentの値自体がまずいんかは分からんが、同じように弾かれとるらしい。
直前にHEADで要求してんのがマズイんか、UserAgentの値自体がまずいんかは分からんが、同じように弾かれとるらしい。
とりあえず、UserAgentはちゃんと設定しましょうという大事なお話。
他にもセキュリティ向上を謳うサービスは多数存在するので、同じような現象になった人居たら参考になれば嬉しいですね。(`・ω・´)
他にもセキュリティ向上を謳うサービスは多数存在するので、同じような現象になった人居たら参考になれば嬉しいですね。(`・ω・´)
更新日: 2018年02月14日 (水) 10時59分00秒
添付ファイル