为什么php无法使用WCF服务工作的WCF 4.0 asp网站?

时间:2012-04-25 19:36:57

标签: php wcf wcf-binding wcf-client

好的,我的.net 4.0客户端运行正常。使用java的人都没有问题。但是当涉及到php时,我们的php开发人员无法正常工作。

现在记住我没有创建一个Wcflibray项目,我创建了一个常规的asp 4.0网站,然后添加了一个WCF服务,所以我没有app.config,我有一个web.config。

我们已经了解了创建两种方法的基本要点

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

string HellowTomorrow(string sret)
{
return sret;
}

在调试模式下,我会看到他输入我的方法,但只能输入null。如果我用wireshark嗤之以鼻,他就没有通过参数信封。

我已无休止地搜索,但所有示例都来自WCF服务项目,而不是添加了WCF服务的网站。 (记住,其他人都没有问题,java,.net 2.0等)

这是他的php 5.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); 


?>

2 个答案:

答案 0 :(得分:1)

使用WCF服务.net作为Server和PHP-soap作为客户端时,您需要严格遵循指南。 PHP-soap的文档不足以进行调试,也不是那么清楚。 PHP nusoap在文档方面略胜一筹,但在示例上仍然不够,对初学者来说不是一个很好的选择。 nusoap有一些例子,但大多数都不起作用。 我建议遵循调试清单:

  1. 检查web.config文件中的绑定。对于PHP
  2. ,它必须是“ basicHttpBinding
  3. PHP, $ client-> __ soapCall()函数将所有参数作为数组发送,因此,如果您的Web服务函数需要输入参数作为数组,则参数必须位于额外数组中。下面给出实施例#3以清除。
  4. 如果需要,请将“数组('soap_version'=> SOAP_1_1)”或“数组('soap_version'=> SOAP_1_2 )”传递给SoapClient()对象明确声明soap版本。
  5. 始终尝试将“array(”trace“=> 1)”声明为SoapClient对象以读取请求&响应字符串。
  6. 使用“ __ getLastResponse(); ”函数读取响应字符串。
  7. 使用“ __ getLastRequest(); ”函数读取请求字符串。
  8. 重要提示:如果您为传递的任何值返回NULL 参数然后检查你的.cs(.net)文件,如下所示:

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

    变量名称在这里传递,必须与在PHP中调用它时匹配。我将其作为以下示例的“测试”。

    示例#1 :使用带有单个参数的php-soap for HelloY yesterday函数

    <?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 :使用带有单个参数的nusoap for HelloY yesterday函数

    <?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>';
    ?>
    

    还有一个例子......将数组作为参数传递或传递混合类型参数,然后检查以下示例:

    示例#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);
    ?>
    

    希望上面的例子有所帮助。

答案 1 :(得分:0)

由于您将wsdl位置传递到SoapClient构造函数,因此您应该可以调用$client->HelloTomorrow($args)。但是,似乎有一些拼写错误,你能否验证它们在你的实际代码中是否正确?在您的Web服务代码中,您将函数命名为HellowTomorrow,但您在PHP代码中调用了HelloTomorrow。此外,该参数在您的Web服务中名为sret,但它在param1关联数组中作为$args传递。是否可以调用不期望任何参数的HelloWorld()

<强>更新: 见NuSOAP and content type

尝试使用内置的PHP SoapClient而不是NuSOAP版本。 PHP的SoapClient看起来默认为UTF-8,其中NuSOAP似乎硬编码为ISO-8859-1