Webサーバから他のサーバへHTTPで要求しXMLを取得するプログラムをVB6.0で作成中です。XML取得のロジックでエラーになってしまいます。代表的な方法を教えてくださると幸いです。
せめて、どんな手法で取得していて、どこで何というエラーに
なるのかぐらいは書いた方が良いでしょう。
Webサーバから要求を発行するという点にしても、それが
1. VB6のIISアプリケーションなのか
2. VB6製ActiveX DLL を ASP から呼び出しているのか
3. VB6で標準出力を扱うアプリを作り、cgi から呼び出しなのか
といった動作についてもわかりませんし。
で、XMLのやり取りと言う事ですが……相手が単に text/xml の content-type を
吐き出すのであれば、MSXML2.ServerXMLHTTP あたりを使うのが手っ取り早いと思いますよ。
補足します。
・ASPからVB6製のActiveXDLLを呼び出すプログラムです
・エラー内容は、「オブジェクトはこのプロパティまたはメソッドをサポートしていません」で、相手方のURLを呼び出した際に発生しています。
詳しい内容が書けなくてすいません。
どのような DLL を、どんなコードで呼び出したときに
そのエラーになったのかがわからない限り、誰も答えられないでしょう。
とりあえず、自作のDLLだとしたら、それが
http://support.microsoft.com/kb/243548/ja
のガイドラインに沿っているかを確認しましょう。
> 詳しい内容が書けなくてすいません。
# 説明不足だった事に対する発言にもとれるけれど、業務上の理由などから
# 詳細を記述するわけにはいかないのだ、という意味の発言にもとれる……。
説明不足にも関わらず、レスありごとうございます。
使用している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を実行すると、上記の変数に値を返す箇所で「オブジェクトはこのプロパティまたはメソッドをサポートしていません」というエラーが発生します。
宜しくお願いします
# なぜ 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
などのようにして、これらのどの部分でエラーになるのかを調査したほうが宜しいかと。
ご返事ありがとうございます。
>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
>>などのようにして、これらのどの部分でエラーになるのかを調査したほうが宜し>>いかと。
#確認してみます。
少ない情報と分かり難い表現で申し訳ございません。
ありがとうございます。
実行している IIS の実行アカウントは、何になっていますか?
(特に指定が無ければ、IUSR_MachineName アカウントのはず)
そして、通信先のサーバの認証モードはどうなっていますか?
(統合Windows認証、BASIC認証、無認証(匿名アクセス)等々)
ServerHTTPRequest を setProperty してありますか?
ロードする XML が、Webサーバ上のリソースではなく、
HDD上のリソースだった場合はどうですか?
>実行している 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上のリソースだった場合はどうですか?
うまく読み込んで、エラーが発生しません。
成功します。
| ツイート |
|