none
HttpWebRequestで要求しても期待した結果が得られない RRS feed

  • 質問

  • VB.NET の初心者です。

    ご教授頂ければ幸いです。

    現在、VB.NETで、XMLのデータをURLから取得したく、奮闘していますが、どうしてもそれが取得できず、却って期待しないcgiのソースのようなものが取得されてしまいます。

    色々試していますが、なかなかうまくいきませんので、今回こちらに投稿させて頂きました。

    とりあえず以下のようなコードを掲載させて頂きます。

    その下に、期待する結果と実際に取得した結果を掲載します。

    どうやったら、期待される結果が取得できるのか検討が付きません。

    どなたかご教授頂けませんでしょうか。


                strID="xxx"

                strPassword="yyyyyy"

                strURL="http://zzzz/home/member/auth/fcgi-bin/ticket.cgi?OPTIONCODE=512&SERVICE=DT&TICKET=3"

                'HttpWebRequestの作成
                Dim webreq As System.Net.HttpWebRequest =
                    CType(System.Net.WebRequest.Create(strURL),
                    System.Net.HttpWebRequest)

                webreq.Credentials = New System.Net.NetworkCredential(strID, strPassword)

                'HttpWebResponseの取得
                Dim webres As System.Net.HttpWebResponse =
                    CType(webreq.GetResponse(), System.Net.HttpWebResponse)

                Dim st As System.IO.Stream = webres.GetResponseStream()
                Dim sr As New System.IO.StreamReader(st)
                Dim strTxt As String = sr.ReadToEnd()

                Dim xmlDocm As New System.Xml.XmlDocument

                xmlDocm.LoadXml(strTxt)

    <期待する結果>

    以下のようなもの。

    strTxt="

    <?xml version="1.0" encoding="Shift_JIS"?>
    <!--  <!DOCTYPE SERVICETICKETVIEW SYSTEM "SERVICETICKETVIEW.dtd">  --><SERVICETICKETVIEW><SERVICES><SERVICE>amcommr0</SERVICE><SERVICE>amrankr0</SERVICE><SERVICE>amtextr0</SERVICE><SERVICE>asbpdfr0</SERVICE>・・・・・・

    "

    <実際に出てきた結果>

    "<HTML>" & vbLf & "<HEAD>" & vbLf & "  <META HTTP-EQUIV=""Content-Type"" CONTENT=""text/html; charset=UTF-8"">" & vbLf & "  <META HTTP-EQUIV=""Cache-Control"" CONTENT=""no-cache"">" & vbLf & "  <META HTTP-EQUIV=""Pragma"" CONTENT=""no-cache"">" & vbLf & "</HEAD>" & vbLf & "<BODY BGCOLOR=""white"" TEXT=""white"">" & vbLf & "SetCookie" & vbLf & "<SCRIPT LANGUAGE=""JavaScript"">" & vbLf & "<!--" & vbLf & ・・・・・・・

    2018年11月6日 1:12

すべての返信

  • > strURL="http://zzzz/home/member/auth/fcgi-bin/ticket.cgi?OPTIONCODE=512&SERVICE=DT&TICKET=3"

    その URL を要求して「<期待する結果>」が返ってくるのは、その Web サイトの仕様として間違いないのですか?

    失礼ながら、そもそもそこがあやしいような気がします。

    Fiddler を使って要求・応答をキャプチャし、Web サーバーがどういう内容のコンテンツを返しているのか等を調べてみてください。

    また、ブラウザから同じ URL を呼び出してみるとどうなるか確認してみてください。
    2018年11月6日 1:41
  • SurferOnWwwさん、ご返信ありがとうございます。

    ブラウザにURLを直うちすると、ブラウザ上にxmlデータが表示されます。

    Fiddlerについては、知りませんでしたので、ちょっと使い方調べてみます。

    不思議なのは以下コードだと、xmlデータがxmlHttp.responseTextにちゃんと入ってきています。

    只、社内環境では、下記MSXMLを使うと、どうも不安定のようで、やはり.NETを使ってやることになりました。MSがMSXMLをサポートしてないことが理由です。

    https://support.microsoft.com/ja-jp/help/815112/the-use-of-msxml-is-not-supported-in-net-applications

    <MSXMLコード>

                xmlHttp = CreateObject("MSXML2.XMLHTTP")
                If xmlHttp Is Nothing Then Exit Function
                With xmlHttp
                    .Open("GET", strURL, False, strID, strPassword)
                    .setRequestHeader("Pragma", "no-cache")
                    .setRequestHeader("Cache-Control", "no-cache")
                    .setRequestHeader("If-Modified-Since", "Thu, 01 Jun 1970 00:00:00 GMT")
                    .send(strID & strPassword)
                    Do While .readyState <> 4
                        'DoEvents
                        Application.DoEvents()
                    Loop
                    If .Status <> 200 Then Exit Function
                End With

                xmlDoc = CreateObject("MSXML2.DOMDocument")
                If xmlDoc Is Nothing Then
                    If Not xmlHttp Is Nothing Then Marshal.ReleaseComObject(xmlHttp)
                    Exit Function
                End If
                xmlDoc.LoadXML(xmlHttp.responseText)

    2018年11月6日 9:10
  • > Fiddlerについては、知りませんでしたので、ちょっと使い方調べてみます。

    Fiddler でなければならないということはありませんけど、今回の質問のような開発を行う場合、トラブルシューティングにはパケットキャプチャツールは必須だと思います。

    Fiddler は無償ですし広く使われています。是非、入手して使ってください。

    ブラウザでは期待通りになるとのことですが、であれば、それとあなたのアプリの場合との要求・応答のキャプチャ結果を比較することで有用な情報が得られるのではないかと思います。

    その結果を書いてください。
    2018年11月6日 9:41
  • 提示いただいた XMLHTTP で、何故、空ループによる readyState プロパティの変更監視を行っているのかが気になりますが、コードの意図が読み取れなかったのが send メソッドの呼び出し。

    .Open("GET", strURL, False, strID, strPassword)
    .send(strID & strPassword)

    send メソッドの引数は HTTP Request Body を表すものですから、GET や HEAD によるリクエスト時には指定することができないはず。(本当に Body を送り付けてしまうのか、それとも引数指定を無視するのかは知りませんが)

    というか、「ブラウザにURLを直うち」したのであれば、Request Body は存在しないはずでは…。

    いずれにせよ、サーバー側がどういう実装になっているのか分からないので、正直何とも言えません。

    個人的には、HTTP Request Header の指定不足ではないかと予想しています。たとえば、Accept:、Accept-Language:、Accept-Encoding:、User-Agent: あたり。もしも Windows 10 をお使いなら、curl コマンドで受信できるかどうかを確認してみるのも良いかも。

    2018年11月6日 10:34
  • SurferOnWwwさん、魔界の仮面弁士さん、ご返信ありがとうございます。

    まだなれませんが、Fiddlerを使って見てみたところ、他にも私がやりたいようなProcessがあり、そのプロセスはリクエストに対して、応答でXMLが返ってきているようです。

    URLは同じようでした。要求は以下となっていました。

    -----------------------------------

    GET 上記strURL
    Accept: */*
    Accept-Encoding: gzip, deflate
    User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E)
    Host: zzzz
    Connection: Keep-Alive
    Pragma: no-cache
    Cookie: PROXYID=8; PXS_YRPX0009=****************************
    Authorization: Basic **************************

    --------------------------------------

    応答では、XMLタブで正常にXMLが表示されていました。

    ですので、同じようにすればいいのかなと思い、下記コードを追加しましたが、やはりXMLデータが取得できませんでした。

    -------------------------------------

    webreq.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E)"
    webreq.Method = "GET"
    webreq.ContentType = "text/xml"
    webreq.Accept = "*/*"
    webreq.AutomaticDecompression = Net.DecompressionMethods.GZip Or Net.DecompressionMethods.Deflate
    webreq.Headers.Add("Accept-Language", "ja-JP")

    ---------------------------------------

    RAWタブを見ると、以下が表示されていました。curl コマンドというのはまだ試していませんが、また調べてみたいと思います。

    今一歩のような感じがしますが、難しいですね。

    HTTP/1.1 200 OK
    Date: Thu, 08 Nov 2018 01:58:02 GMT
    Server: ***********
    Accept-Ranges: bytes
    Content-Length: 778
    Expires: Thu, 01 Jan 1970 00:00:00 GMT
    Set-Cookie: PROXYID=*; path=/home/member; expires=Tue, 31 Dec 2030 12:00:00 GMT
    X-Cnection: close
    Content-Type: text/html

    <HTML>
    <HEAD>
      <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
      <META HTTP-EQUIV="Cache-Control" CONTENT="no-cache">
      <META HTTP-EQUIV="Pragma" CONTENT="no-cache">
    </HEAD>

    ・・・・・・・

    2018年11月8日 2:06
  • Cookie: PROXYID=8; PXS_YRPX0009=****************************

    Cookie が使われていますね。以前にアクセスしたページで Set-Cookie レスポンスがあったのではないでしょうか。(Expires= が無い場合、ブラウザーを開いている間だけ有効な揮発性 Cookie となります)

    ということで、HttpWebRequest.CookieContainer プロパティも指定してみてください。

    2018年11月8日 2:57
  • > Fiddlerを使って見てみたところ、他にも私がやりたいようなProcessがあり、そのプロセスはリクエストに対して、応答でXMLが返ってきているようです。

    「他にも私がやりたいようなProcessがあり、そのプロセスはリクエストに対して」の意味が分かりませんが、どういうことなんですか? 回答者は、ここに書いてあること以外は何も知り得ないということを意識して情報提供願います。

    > URLは同じようでした。

    「ようでした」ということは同じかどうか定かでないと言ってます? 同じかどうかは要求ヘッダを見れば分かるはずですけど????

    > 要求は以下となっていました。

    それはどのケースですか? ブラウザで要求して期待通りの XML が返ってくる場合? HttpWebRequest のアプリで要求した場合? 私はその両方を比較するようアドバイスしましたが、やってみましたか? どこがどう違っていましたか?

    応答ヘッダも比較して見ましたか? どこがどう違ってましたか?

    ところで、プロキシサーバーを使ってますか? であればその影響は調べてみましたか?

    2018年11月8日 3:02
  • 【追伸】

    そもそも、要求先のサイトの仕様は明確になっていて、その仕様に従って要求を出せていることは確認されているのでしょうか?

    xml でない html の中身をみてみましたか? ひょっとしてエラーメッセージの類が返されていて、それに有用な情報があったりしませんか? Fiddler で WebView にして見てください。
    2018年11月8日 3:33