0

わかりました。私の.net4.0クライアントは正常に動作します。Javaを使用している人はすべて問題ありません。しかし、phpに関して言えば、私たちのphp開発者は何も機能させることができません。

ここで、Wcflibrayプロジェクトを作成しなかったことを覚えておいてください。通常の、asp 4.0 Webサイトを作成してから、WCFサービスを追加したので、app.configがなく、web.configがあります。

2つのメソッドを作成するための基本事項について説明しました。

string HelloWorld()
{
return "Hello!";
}

string HellowTomorrow(string sret)
{
return sret;
}

デバッグモードでは、彼が私のメソッドを入力するのが表示されますが、nullのみです。私がwiresharkでパケットをスニッフィングする場合、彼はパラメータエンベロープを通過していません。

私は際限なくグーグルで検索しましたが、すべての例はWCFサービスプロジェクトからのものであり、WCFサービスも追加したWebサイトではありません。(覚えておいてください、他の誰もが問題を抱えていません、java、.net 2.0など)

これが彼のphp5.3です

error_reporting(E_ALL);

ini_set('display_errors','On');

$client = new SoapClient("http://99-mxl9461k9f:6062/DynamicWCFService.svc?wsdl", array('soap_version' => SOAP_1_1));

$client->soap_defencoding = 'UTF-8';


//$args = array('john');


$args = array('param1'=>'john');


$webService = $client->__soapCall('HelloTomorrow',$args);


//$webService = $client->HelloTomorrow($args); 


var_dumpp($webService); 


?>
4

2 に答える 2

1

WCF サービス .net をサーバーとして、PHP-soap をクライアントとして使用する場合は、ガイドラインに厳密に従う必要があります。PHP-soap のドキュメントは、デバッグするのに十分ではなく、明確でもありません。PHP nusoap は、ドキュメンテーションに関しては少し優れていますが、例としてはまだ十分ではなく、初心者にとっては良い選択ではありません。nusoap にはいくつかの例がありますが、それらのほとんどは機能しません。次のデバッグ チェックリストをお勧めします。

  1. web.config ファイルのバインディングを確認してください。PHP の場合は「<strong>basicHttpBinding」でなければなりません
  2. PHP、$client->__soapCall()関数はすべての引数を配列として送信するため、Web サービス関数が入力パラメーターを配列として必要とする場合、引数は追加の配列にある必要があります。明確にするために、例#3を以下に示します。
  3. 必要に応じて、「<strong>array('soap_version' => SOAP_1_1)」または「<strong>array('soap_version' => SOAP_1_2)」を SoapClient() オブジェクトに渡して、SOAP バージョンを明示的に宣言します。
  4. リクエストとレスポンスの文字列を読み取るために、常に「array( "trace" => 1 )」を SoapClient オブジェクトに宣言してみてください。
  5. 「<strong>__getLastResponse();」を使用 応答文字列を読み取る関数。
  6. 「<strong>__getLastRequest();」を使用 リクエスト文字列を読み取る関数。

重要: パラメータとして渡された値に対して NULL が返される場合は、次のような .cs(.net) ファイルを確認してください。

   [ServiceContract]
    public interface IDynamicWCFService
    {
        [OperationContract]
        string HelloYesterday(string test);
    }

変数名はここに渡され、PHP で呼び出すときに一致する必要があります。以下の例では、これを「テスト」としています。

例 #1 : HelloYesterday 関数の単一パラメーターで php-soap を使用する

<?php
$url="http://99-mxl9461k9f:6062/DynamicWCFService.svc?WSDL";
$client = new SoapClient($url, array( "trace" => 1 ));
$result = $client->HelloYesterday(array('test' => 'this is a string'));
var_dump($result);
$respXML = $client->__getLastResponse();
$requXML = $client->__getLastRequest();
echo "Request: <br>";
var_dump($requXML);
echo "Response: <br>";
var_dump($respXML);
?>

例 #2 : HelloYesterday 関数の単一パラメーターで nusoap を使用する

<?php 
require_once('../lib/nusoap.php');
$proxyhost = isset($_POST['proxyhost']) ? $_POST['proxyhost'] : '';
$proxyport = isset($_POST['proxyport']) ? $_POST['proxyport'] : '';
$proxyusername = isset($_POST['proxyusername']) ? $_POST['proxyusername'] : '';
$proxypassword = isset($_POST['proxypassword']) ? $_POST['proxypassword'] : '';
$url="http://99-mxl9461k9f:6062/DynamicWCFService.svc?WSDL";
$client = new nusoap_client($url, 'wsdl', $proxyhost, $proxyport, $proxyusername, $proxypassword); $client->soap_defencoding = 'UTF-8'; // this is only if you get error of soap encoding mismatch.
$err = $client->getError();
if ($err) {
    echo '<h2>Constructor error</h2><pre>' . $err . '</pre>';
}
// Doc/lit parameters get wrapped
$param = array('test' => ' This is a string for nusoap');
$result = $client->call('HelloYesterday', array('parameters' => $param), '', '', false, true);
// Check for a fault
if ($client->fault) {
    echo '<h2>Fault</h2><pre>';
    print_r($result);
    echo '</pre>';
} else {
    // Check for errors
    $err = $client->getError();
    if ($err) {
        // Display the error
        echo '<h2>Error</h2><pre>' . $err . '</pre>';
    } else {
        // Display the result
        echo '<h2>Result</h2><pre>';
        print_r($result);
        echo '</pre>';
    }
}
echo '<h2>Request</h2><pre>' . htmlspecialchars($client->request, ENT_QUOTES) . '</pre>';
echo '<h2>Response</h2><pre>' . htmlspecialchars($client->response, ENT_QUOTES) . '</pre>';
echo '<h2>Debug</h2><pre>' . htmlspecialchars($client->debug_str, ENT_QUOTES) . '</pre>';
?>

もう 1 つの例… 配列をパラメーターとして渡すか、混合型パラメーターを渡し、次の例を確認します。

例 #3:配列パラメーターを含む混合型パラメーターを SOAP 関数に渡す。.net 操作ファイルの例

   [ServiceContract]
    public interface IDynamicWCFService
    {
        [OperationContract]
        string[] HelloYesterday (string[] testA, string testB, int testC );
    }

PHP コード

<?php
$url="http://99-mxl9461k9f:6062/DynamicWCFService.svc?WSDL";
$client = new SoapClient($url, array( "trace" => 1 ));
$params = array(
"testA" => array(0=>"Value1",1=>"Value2",2=>"Value3"),
"testB" => “this is string abc”,
"testC" =>123
); // consider the first parameter is an array, and other parameters are string & int type.
$result = $client->GetData($params); 
var_dump($result);
$respXML = $client->__getLastResponse();
$requXML = $client->__getLastRequest();
echo "Request: <br>";
var_dump($requXML);
echo "Response: <br>";
var_dump($respXML);
?>

上記の例が役立つことを願っています。

于 2012-05-01T16:10:49.760 に答える
0

wsdlの場所をSoapClientコンストラクターに渡すので、を呼び出すことができるはずです$client->HelloTomorrow($args)。いくつかのタイプミスがあるようですが、実際のコードでそれらがすべて正しいことを確認できますか?Webサービスコードでは、関数に名前を付けますが、PHPコードでHellowTomorrow呼び出しています。HelloTomorrowまた、パラメーターはWebサービスで名前が付けられていますが、連想配列sretのように渡されています。パラメータを予期しない呼び出しで機能しますか?param1$argsHelloWorld()

更新NuSOAPとコンテンツタイプを参照してください

NuSOAPバージョンの代わりに組み込みのPHPSoapClientを使用してみてください。PHPのSoapClientは、デフォルトでUTF-8に設定されているように見えますが、NuSOAPはISO-8859-1にハードコーディングされているようです。

于 2012-04-25T19:55:51.893 に答える