locked
IISの仮想フォルダにあるファイルを取得するとファイルが0バイトになる RRS feed

  • 全般的な情報交換

  • ご担当者様

    お世話になっております。

    武山と申します。

    Windows Server 2016にIIS10.0を構成しました。

    仮想フォルダにあるファイルを別の端末からwgetコマンドで取得したいのですが、

    ファイルの取得はできるものの、なぜか0バイト(空ファイル)になってしまいます。

    調査したところ、静的な圧縮のキャッシュディレクトリをウィルススキャン対象になっていると、

    0バイトのファイルが返されることがあるという記事を見つけました。

    こちらに倣い対象ディレクトリをスキャン対象から除外しましたが、解消されませんでした。

    ファイルを正常に取得できないと後続の処理に大きく影響してしまうため、

    早急に解決したいと思っております。

    解決方法をご教示ください。

    以上、よろしくお願いいたします。

    2020年9月1日 9:07

すべての返信

  • IIS カテゴリーに投稿されていますが、サーバー起因の現象なのか、クライアント起因の現象なのか切り分けできていますか?

    別のクライアントから試す、wget ではなくブラウザーでダウンロードしてみる、ネットワーク パケットキャプチャを採取してみる、などの切り分けが考えられますが。


    Hebikuzure aka Murachi Akira


    2020年9月1日 11:18
  • ありがとうございます。

    はい、複数のクライアントから試しており、wgetおよびブラウザーでダウンロードしましたが同じ結果でした。

    パケットキャプチャはまだ確認しておりません。

    2020年9月2日 0:13
  • パケットキャプチャかブラウザーの開発者ツールで、そもそもサーバーからファイルのデーターが送られて来ていないのか、サーバーからは送信されているがクライアントで保存できていないのかが分かると思います。

    実際にサーバーからどんな HTTP ヘッダーとデーターが返ってきているのか、確認してみてください。


    Hebikuzure aka Murachi Akira

    2020年9月2日 5:10
  • HTTPサーバ上でnetsh trace start capture=yesを実行してパケットキャプチャを取得してみました。

    Microsoft Network Monitorでキャプチャ内容を確認し、抜粋したものが以下になります。

    ClientからServerに向かってwgetコマンドをSpiderモードで実行しました。

    素人なのでまったく詳しくないのですが、これらの情報から糸口は見つけられそうでしょうか。

    ↓wgetコマンド実行結果

    ---request begin---
    HEAD /point/term.20200831 HTTP/1.0
    User-Agent: Wget/1.11.4
    Accept: */*
    Authorization: Basic XXXXXX
    Host: HTTP Server
    Connection: Keep-Alive

    ---request end---
    HTTP request sent, awaiting response...
    ---response begin---
    HTTP/1.1 200 OK
    Content-Length: 0
    Server: Microsoft-IIS/10.0
    X-Powered-By: ASP.NET
    Date: Wed, 02 Sep 2020 05:18:08 GMT
    Connection: keep-alive

    ---response end---

      HTTP/1.1 200 OK
      Content-Length: 0
      Server: Microsoft-IIS/10.0
      X-Powered-By: ASP.NET
      Date: Wed, 02 Sep 2020 05:18:08 GMT
      Connection: keep-alive
    Registered socket 548 for persistent reuse.
    Length: 0
    Remote file exists and could contain further links,
    but recursion is disabled -- not retrieving.

    ↓パケットキャプチャ

    HTTP Server Client TCP TCP: [Bad CheckSum]Flags=...A..S., SrcPort=HTTP(80), DstPort=52870, PayloadLen=0, Seq=2363253859, Ack=3207955921, Win=8192 ( Negotiated scale factor 0x8 ) = 819
    Client HTTP Server TCP TCP:Flags=...A...., SrcPort=52870, DstPort=HTTP(80), PayloadLen=0, Seq=3207955921, Ack=2363253860, Win=515
    Client HTTP Server HTTP HTTP:Request, HEAD /point/term.20200831 , Using Basic Authorization
    HTTP Server Client TCP TCP: [Bad CheckSum]Flags=...A...., SrcPort=HTTP(80), DstPort=52870, PayloadLen=0, Seq=2363253860, Ack=3207956128, Win=1026 (scale factor 0x0) = 1026
    HTTP Server Client HTTP HTTP:Response, HTTP/1.1, Status: Ok, URL: /point/term.20200831 
    Client HTTP Server TCP TCP:Flags=...A.R.., SrcPort=52870, DstPort=HTTP(80), PayloadLen=0, Seq=3207956128, Ack=2363254010, Win=0

    2020年9月2日 5:34
  • リクエストが HEAD メソッドなのでコンテンツが返されないのは正常なレスポンスですが、HEAD の後に GET のリクエストは無いのでしょうか?


    Hebikuzure aka Murachi Akira

    2020年9月2日 5:39
  • はい、キャプチャを見る限りGETリクエストは出ていません。
    2020年9月2日 5:49
  • wget やブラウザーでダウンロードを行っている手順はどのようなものでしょうか?

    wget だと --header オプションで HEAD リクエストを出すようですが。


    Hebikuzure aka Murachi Akira

    2020年9月2日 5:55
  • 以下のコマンドを実行しています。

    wget http://HTTP Server/point/term.20200831 --http-user=user --http-password=password -S --auth-no-challenge -d --spider

    spiderオプションを抜いたらGETリクエストが出ました。

    以下はSpiderオプションを指定しなかったときのキャプチャになります。

    HTTP Server Client TCP TCP: [Bad CheckSum]Flags=...A..S., SrcPort=HTTP(80), DstPort=51037, PayloadLen=0, Seq=2379661978, Ack=2928167956, Win=8192 ( Negotiated scale factor 0x8 ) = 8192
    Client HTTP Server TCP TCP:Flags=...A...., SrcPort=51037, DstPort=HTTP(80), PayloadLen=0, Seq=2928167956, Ack=2379661979, Win=515
    Client HTTP Server HTTP HTTP:Request, GET /point/term.20200831 , Using Basic Authorization
    HTTP Server Client HTTP HTTP:Response, HTTP/1.1, Status: Ok, URL: /point/term.20200831 
    Client HTTP Server TCP TCP:Flags=...A.R.., SrcPort=51037, DstPort=HTTP(80), PayloadLen=0, Seq=2928168162, Ack=2379662129, Win=0

    2020年9月2日 5:58
  • 追加情報となります。

    HTTP Serverからlocalhost指定でブラウザからアクセスしても、同じようにファイルが空になってしまいます。

    ファイルが配置してあるURLにアクセスするとファイルサイズが確認できますが、そこでは0バイト以上のサイズになっていますが、

    ファイルをクリックして中身を確認すると真っ白な画面になる(何も表示されない)という状況になっております。

    2020年9月2日 9:46
  • GET リクエストに対する HTTP レスポンス ヘッダーも content-length が 0 でボディが付いていないのでしょうか?


    Hebikuzure aka Murachi Akira

    2020年9月2日 14:28
  • はい、どちらもその状態となっております。
    2020年9月3日 0:03
  • Fiddler を使って、基本認証がかかかっているなら認証用のヘッダ Authorization: Basic xxx... を要求ヘッダに含め(xxx... の部分は[ユーザ名]と[パスワード]をコロン ":" でつなぎ Base64 でエンコードしたもの)て GET 要求をかけ、要求ヘッダと応答ヘッダ・ボディ部がどうなっているか調べることはできませんか? その中にヒントがありそうな気がします。

    > 仮想フォルダにあるファイルを別の端末からwgetコマンドで取得したいのですが、

    そもそもサーバー側はどうなっているのですか?

    「仮想フォルダ」とだけ言われても IIS にどのように設定されているかなどサーバー側の構成・設定が分かりません。基本認証がかかっているように見えますがそのあたりの情報もないし。取得したい「ファイル」が何かも分かりません。

    閲覧者・回答者が自分の環境で全く同じ構成・設定を IIS に行って、同種のファイルをフォルダに置いて、実際に取得して試してみることができる程度の情報が提供できませんか?
    2020年9月3日 0:36