2011-02-05 190 views
2

PHPからセットアップしたWebサービスを呼び出す際に問題があります。下のエラーメッセージの難読化されたアドレスhttp://XXX.XXX.XXX.XXX/test.asmx?wsdlは、有効なWSDLを返します。私は正常にVB.netのクライアントを使用してWebサービスとしてそれを呼び出すようにしようとしましたが、私は次のメッセージを得るのDebian上でPHPからそれを呼び出すとき:問題は何をすることができ致命的なエラー:Uncaught SoapFault例外:[WSDL]

 
Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: 
    Couldn't load from 'http://XXX.XXX.XXX.XXX/test.asmx?wsdl' 
    in /var/www/domain/mywebsite.com/public_html/catalog/fomeus/orders.php:101 

Stack trace: 
    #0 /var/www/domain/mywebsite.com/public_html/catalog/fomeus/orders.php(101): 
    SoapClient->SoapClient('http://XXX.XXX.XXX.XXX/', Array) #1 {main} thrown 
    in /var/www/domain/mywebsite.com/public_html/catalog/fomeus/orders.php 
    on line 101 

を?私は以下のWebサービスとPHPクライアント用のコードを含んでいます。

Webサービス:

Imports System.Web.Services 
Imports System.Web.Services.Protocols 
Imports System.ComponentModel 
... 
' To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
' <System.Web.Script.Services.ScriptService()> _ 
<System.Web.Services.WebService(Namespace:="http://tempuri.org/")> _ 
<System.Web.Services.WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _ 
<ToolboxItem(False)> _ 
Public Class WebService1 
Inherits System.Web.Services.WebService 
    <WebMethod()> _ 
    Public Function HelloWorld() As String 
     Return "Hello World" 
    End Function 
End Class 

PHPクライアント:

require_once($_SERVER['DOCUMENT_ROOT']."/catalog/fomeus/includes/soap/nusoap.php"); 

$objClient = new soapclient("http://XXX.XXX.XXX.XXX/test.asmx?wsdl", 
    array('trace' => 1, 'exception' => 0, 'cache_wsdl' => 0)); 

print_r($objClient -> HelloWorld()); 

それは任意の助けだ場合、私はPHPのバージョン5.2.6を使用しています。私は問題が何であるかを把握しようとしている別のフォーラムでたくさんの投稿を行ってきました。多くの人が同じ問題を抱えていますが、これまでに私が見つけた解決策のどれも私のためには働きません。どんな助けでも大歓迎です。

+0

に取り組んで私のために働きましたか? – Nacho

+0

SoapClientオブジェクトを作成する行の周りにtry..catchブロックをラップしてみてください。キャッチすることを忘れてはいけません。つまりcatch(Exception $ e){}ではなくcatch(SoapFault $ e){} catch内で例外フィールド(getMessageなど)を照会するか、var_dump例外を表示し、それがあなたに伝えるものを投稿します。 – Stephen

+0

wsdlを投稿できますか? – zode64

答えて

0

あなたは(PHP 5.2は、私が好むネイティブのSoapClientを、持っている)nusoapを使用している場合は、私が見る最初の事はあなたの引数です。 nusoapのsoapclientコンストラクタの引数#2は、配列ではなくWSDLを使用している場合は、ここではTRUEにする必要があります。試してみてください:

$objClient = new soapclient("http://XXX.XXX.XXX.XXX/test.asmx?wsdl",true); 
print_r($objClient->HellowWorld()); 

これは私が過去にwsdlで作業できた方法です。

あなたはネイティブクライアントを使用して、WSDLに問題がある場合、あなたは常にそれをバイパスし、まっすぐに電話をかけることが、そうのようなことができます動作するはず

$objClient = new soapclient(null,array('uri'=>'http://xxx/test.asmx','location'=>'http://xxx/test.asm')); 
$objClient->__call('HelloWorld',array()); 

、しかしとして簡単ではありませんwsdlとしてナビゲートします。

+0

元のポスターについてはわかりませんが、natie php soapクライアントを使用しています –

+0

ネイティブPHP soapclientでもっとも成功したのは次のようになりました。 $ objClient = new soapclient(null、array( 'uri '=>' http://xxx/test.asmx','location'=> 'http://xxx/test.asmx')); $ objClient - > __ call( 'HelloWorld'、array());でメソッドを呼び出します。 –

+1

私がやったことは、file_get_contentsでwsdlファイルを要求し、それをローカルにキャッシュしてからSoapClientで使用することでした。そうすれば、それが有効なXMLであるかどうかをチェックして問題を回避することができます(醜いですが動作します) –

1

もう1つのオプションはcURLです。ペイロードをXML文字列として作成し、cURLを使用して同じURLに送信することができます。次に、レスポンスコードを取得して、必要に応じて処理する必要があります。 SOAPClientで問題が発生したとき、私はcURLに移動しました - 魅力のように動作します。

+0

Permhiwa:この点についていくつかのサンプルコードを教えてください。 –

0

は、あなたのphp.iniのphp_soap.dllとphp_openssl.dllをオンにしてみてください。 apacheのフォルダ\ apacheの\ apache2.4.2 \ binに

削除 ";" index.phpを追加

0

は、私はこれがあるかもしれないものか見当もつかないが、あなたはnuSOAPをしようとするためのいずれかの可能性があるPHPアプリケーション

$client = new SoapClient('http://www.domain.com/api/v2_soap/?wsdl'=1) 

$client = new SoapClient('http://www.domain.com/index.php/api/v2_soap/?wsdl'=1) 
関連する問題