豚吐露@wiki

WebRequestでGETするとWebExceptionが発生する

最終更新:

Bot(ページ名リンク)

- view
管理者のみ編集可

WebRequestでGETするとWebExceptionが発生する

Windows 7-64bit Professional
Visual Studio 2008 Professional
.Net Framework 3.5
C# 3.0

任意のサイトにSystem.Net.WebRequestを用いてGETを行おうとしたところ、例外が発生してGETできないという現象に陥った。(´・ω・`)

HTTP Statusも返って来ないし、通常のブラウザなら閲覧可能。
wget使っての取得も問題無し。
なのに、WebRequestはダメ。

発生した例外はコレ。

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


と言う訳で、半日かけて原因が判明したのでφ(..*)メモメモ...

原因としては接続先Webサーバが使ってるセキュリティサービスが原因みたい。
今回に限って言うと、どうやら コイツ

こういうセキュリティサービスって怪しい接続が来るとHTTP Statusも返さんと強制的にHTTP接続を切断するみたい。
で、強制的に切断されると...こうなる。(´・ω・`)

とりあえず、調査方法と結果を以下に書いて行こう。


まず、どうやっても取得できない。
『基礎になる接続が閉じられました』ってなんやねん!!って話。
ぐーぐる先生に聞いても大した情報は得られず...

仕方がないので色々調べていった。

まず対象URLからGETができんパターンが他に無いか?
とりあえず、ブラウザは大丈夫。『WebRequest』はダメ。じゃlinuxから『wget』は?ってぇと大丈夫だった。
なんでwgetは大丈夫なん?と思いつつ、今度はWindowsから『bitsadmin /transfer get』で試してみると...ダメ。

意味が分からんと思いつつ、apache起動させて、同じように色んなトコからGETして、どんなAccessLogになるんか見てみたら...こんな感じになった。
  1. 192.168.1.1 - - [24/Dec/2015:01:23:45 +0900] "GET / HTTP/1.1" 200 491 "-" "Wget/1.15 (linux-gnu)"
  2. 192.168.1.2 - - [24/Dec/2015:02:23:45 +0900] "GET / HTTP/1.1" 200 491 "-" "-"
  3. 192.168.1.2 - - [24/Dec/2015:03:23:45 +0900] "HEAD / HTTP/1.1" 200 314 "-" "Microsoft BITS/7.5"
  4. 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』という見慣れない文字が出てきちまった...
$ 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サーバ動かしといて、その手前でセキュリティ機能を提供する鯖かましとるんじゃろうね。

そう考えると、『基礎になる接続が閉じられました: 接続が予期せずに閉じられました』ってWebExceptionは、WebRequestからの接続を『怪しいトコからの接続だ!』って判断して強制的に切断しとるように思える。

じゃ、何が原因なんよ?wgetとか大したことしてねーよ。と思いつつApacheのaccess.log眺めてたら...
wgetってちゃんとUserAgent設定してるのね。※『Wget/1.15 (linux-gnu)』ってトコがUserAgent。
したら、WebRequsetにも、ちゃんとUserAgent設定してみるか...って設定してみたら...あっさり接続できた。(´Д`)

どうやら、scutumってサービスは、UserAgentが空だと怪しいトコからの接続だと判断してるみたいです。

『bitsadmin /transfer get』の方もUserAgent設定してあるみたいじゃが...
直前にHEADで要求してんのがマズイんか、UserAgentの値自体がまずいんかは分からんが、同じように弾かれとるらしい。

とりあえず、UserAgentはちゃんと設定しましょうという大事なお話。
他にもセキュリティ向上を謳うサービスは多数存在するので、同じような現象になった人居たら参考になれば嬉しいですね。(`・ω・´)





更新日: 2018年02月14日 (水) 10時59分00秒

名前:
コメント:

すべてのコメントを見る
添付ファイル
記事メニュー
ウィキ募集バナー