WebサーバからHTTPを要求しXMLを取得するには


マンマミーヤ  2006-02-10 22:45:06  No: 94141

Webサーバから他のサーバへHTTPで要求しXMLを取得するプログラムをVB6.0で作成中です。XML取得のロジックでエラーになってしまいます。代表的な方法を教えてくださると幸いです。


魔界の仮面弁士  2006-02-10 23:16:33  No: 94142

せめて、どんな手法で取得していて、どこで何というエラーに
なるのかぐらいは書いた方が良いでしょう。

Webサーバから要求を発行するという点にしても、それが
  1. VB6のIISアプリケーションなのか
  2. VB6製ActiveX DLL を ASP から呼び出しているのか
  3. VB6で標準出力を扱うアプリを作り、cgi から呼び出しなのか
といった動作についてもわかりませんし。


で、XMLのやり取りと言う事ですが……相手が単に text/xml の content-type を
吐き出すのであれば、MSXML2.ServerXMLHTTP あたりを使うのが手っ取り早いと思いますよ。


マンマミーヤ  2006-02-10 23:29:31  No: 94143

補足します。
・ASPからVB6製のActiveXDLLを呼び出すプログラムです
・エラー内容は、「オブジェクトはこのプロパティまたはメソッドをサポートしていません」で、相手方のURLを呼び出した際に発生しています。


マンマミーヤ  2006-02-10 23:36:40  No: 94144

詳しい内容が書けなくてすいません。


魔界の仮面弁士  2006-02-11 11:58:24  No: 94145

どのような DLL を、どんなコードで呼び出したときに
そのエラーになったのかがわからない限り、誰も答えられないでしょう。

とりあえず、自作のDLLだとしたら、それが
http://support.microsoft.com/kb/243548/ja
のガイドラインに沿っているかを確認しましょう。


> 詳しい内容が書けなくてすいません。
# 説明不足だった事に対する発言にもとれるけれど、業務上の理由などから
# 詳細を記述するわけにはいかないのだ、という意味の発言にもとれる……。


マンマミーヤ  2006-02-11 12:30:08  No: 94146

説明不足にも関わらず、レスありごとうございます。

使用しているDLLはMSXML3.0を参照設定し、
XMLを参照するロジックは以下のような記述をしています

Dim  nodItem As DOMDocument

Set nodItem = New DOMDocument
nodItem.async = False
nodItem.Load (http://test/test.xml)
kekka = nodItem.selectSingleNode("//test").nodeTypedValue

変数Kekkaにノードの値が返ってくることを考えています。
しかし、EXE形式のテストプログラムからこのDLLを動かすと、値が取れるのですが
WebサーバーのASPからDLLを実行すると、上記の変数に値を返す箇所で「オブジェクトはこのプロパティまたはメソッドをサポートしていません」というエラーが発生します。

宜しくお願いします


魔界の仮面弁士  2006-02-11 15:17:43  No: 94147

# なぜ MSXML4 や MSXML5 ではなく、MSXML3 なのでしょう?

> Dim  nodItem As DOMDocument
ASP から使用するなら、FreeThreadedDOMDocument の方が良いかと。

> nodItem.Load (http://test/test.xml)
これだと、明らかに文法違反なんですが。(^^;

それはともかく、VB6/VBA/VBScriptでは、戻り値を持たないメソッドの
呼び出し時には、括弧を付けないようにしましょう。

どうしても付けたいなら、Call キーワードを利用するようにします。


> EXE形式のテストプログラムからこのDLLを動かすと、値が取れるのですが
そのテストEXEを、デスクトップ上で実行させるのではなく、
ASP から起動させた場合には、DLL は正常に動作しますか?

# 通常、IISの実行ユーザーと、デスクトップのログオンユーザーとでは、
# セキュリティ的な差があるので、念のために確認してみてください。


> WebサーバーのASPからDLLを実行すると、
まずは問題の切り分けをしてみましょう。

DLL 経由で呼び出すのではなく、ASP 上から直接 MSXML3 のオブジェクトを
Server.CreateObject して呼び出すと、どのような結果になりますか?

load メソッド呼出し後の parseError に、エラー情報が渡されていませんか?

DomDocument オブジェクトの selectSingleNode を直接呼び出すのではなく、
.documentElement.selectSingleNode のように呼び出した場合はどうでしょうか?

MSXML3 の場合、規定のXMLクエリ言語が XPath ではなく、XSLPattern に
なっていますが、その点は大丈夫ですか?

load メソッドに指定した引数は、IIS サービスの実行ユーザーが参照可能な
アドレスを示していますか?

load メソッドでURLを渡す代わりに、loadXML に、XML文字列を直接渡して
テストした場合には、それ以降のコードは期待動作するのでしょうか?

> 上記の変数に値を返す箇所
状況を把握するために、呼び出し方を冗長的にしてみましょう。

もしもこれが、
  kekka = nodItem.selectSingleNode("//test").nodeTypedValue
の行に対するエラーなのだとしても、このままでは、
エラーメッセージ中の『オブジェクト』というのが、上記コードの
nodItem の事なのか、それとも nodItem.selectSingleNode(〜) の
事なのかわかりませんし、『プロパティまたはメソッド』の方にしても、
selectSingleNode の事か nodeTypedValue の事なのかが見えませんよね。

なので、その一行を、
  kekka = Empty
  Query = "//test"
  Set oNode = nodItem.selectSingleNode(Query)
  If Not oNode Is Nothing Then
    kekka = oNode.nodeTypedValue
  End If
などのようにして、これらのどの部分でエラーになるのかを調査したほうが宜しいかと。


マンマミーヤ  2006-02-13 11:45:33  No: 94148

ご返事ありがとうございます。

>ASP から使用するなら、FreeThreadedDOMDocument の方が良いかと。

#現象、変わりませんでした

>> nodItem.Load (http://test/test.xml)
>これだと、明らかに文法違反なんですが。(^^;

#すいません、書き方が悪かったです。
正式には
nodItem.Load(変数)
変数には「http://www.yahoo.co.jp/test.xml」のように
他の処理で取得したURLがString型で入ります

>そのテストEXEを、デスクトップ上で実行させるのではなく、
>ASP から起動させた場合には、DLL は正常に動作しますか?

#正常に動作しません。デスクトップ上ですが、ASPと同じサーバー上
でテストを行っています。そのテストEXEからは正常に動作します。
ASPからの直接の実行ですが、システム、開発環境の都合上難しいのが
現状です。

>> kekka = Empty
>>  Query = "//test"
>>  Set oNode = nodItem.selectSingleNode(Query)
>>  If Not oNode Is Nothing Then
>>    kekka = oNode.nodeTypedValue
>>  End If
>>などのようにして、これらのどの部分でエラーになるのかを調査したほうが宜し>>いかと。

#確認してみます。

少ない情報と分かり難い表現で申し訳ございません。

ありがとうございます。


魔界の仮面弁士  2006-02-13 11:59:16  No: 94149

実行している IIS の実行アカウントは、何になっていますか?
(特に指定が無ければ、IUSR_MachineName アカウントのはず)


そして、通信先のサーバの認証モードはどうなっていますか?
(統合Windows認証、BASIC認証、無認証(匿名アクセス)等々)


ServerHTTPRequest を setProperty してありますか?


ロードする XML が、Webサーバ上のリソースではなく、
HDD上のリソースだった場合はどうですか?


マンマミーヤ  2006-02-14 12:09:35  No: 94150

>実行している IIS の実行アカウントは、何になっていますか?
>(特に指定が無ければ、IUSR_MachineName アカウントのはず)
>そして、通信先のサーバの認証モードはどうなっていますか?
>(統合Windows認証、BASIC認証、無認証(匿名アクセス)等々)

#確認してみます。

>ServerHTTPRequest を setProperty してありますか?
以下のように、MSDNを参考にsetPropertyをTrueにしてもだめでした。

Set nodItem = New DOMDocument
nodItem.async = False
nodItem.setProperty "ServerHTTPRequest",True
nodItem.Load(変数)

>ロードする XML が、Webサーバ上のリソースではなく、
>HDD上のリソースだった場合はどうですか?
うまく読み込んで、エラーが発生しません。
成功します。


※作成する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。







   このエントリーをはてなブックマークに追加