【问题标题】:Why cant php work with WCF 4.0 asp website with a WCF service work?为什么 php 不能与 WCF 4.0 asp 网站一起使用 WCF 服务工作?
【发布时间】:2012-04-25 19:36:57
【问题描述】:

好的,我的 .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); 


?>

【问题讨论】:

  • 您的 WCF 服务使用哪种绑定?我看到您的 PHP 客户端使用 SOAP 1.1,并且在 WCF 中只有 basicHttpBinding 将与此标准兼容。
  • 至于绑定问题,我怎么知道?它没有在我的 wsdl、web.config 或代码中定义。上面就是你所看到的。
  • 这里是 web.config
  • 这是一个有效的 .net 4.0 客户端 app.cofig 99hveleads.admin.les.local/DynamicWCFService.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IDynamicWCFService" contract="wcf.IDynamicWCFService" name="BasicHttpBinding_IDynamicWCFService 仅供参考,我删除了一些标签以适应
  • Error HTTP 错误:不支持的 HTTP 响应状态 415 无法处理消息,因为内容类型为 'text/xml; charset=ISO-8859-1' 不是预期的类型 'text/xml;字符集=utf-8'。 (soapclient->response 有响应的内容) Request POST /DynamicWCFService.svc HTTP/1.0 Host: 99-mxl9461k9f:6062 User-Agent: NuSOAP/0.9.5 (1.123) Content-Type: text/xml; charset=ISO-8859-1 SOAPAction: "tempuri.org/IDynamicWCFService/HelloTomorrow" Content-Length: 389 是更改字符集的问题

标签: php wcf wcf-binding wcf-client


【解决方案1】:

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

  1. 检查 web.config 文件中的绑定。对于 PHP,它必须是“basicHttpBinding
  2. PHP,$client->__soapCall() 函数将所有参数作为数组发送,因此如果您的 Web 服务函数需要将输入参数作为数组,那么参数必须在一个额外的数组中。下面给出示例#3 来清除。
  3. 如果需要,然后将“array('soap_version' => SOAP_1_1)”或“array('soap_version' => SOAP_1_2)”传递给 SoapClient() 对象明确声明soap版本。
  4. 始终尝试向 SoapClient 对象声明“array("trace" => 1)”以读取请求和响应字符串。
  5. 使用“__getLastResponse();”函数读取响应字符串。
  6. 使用“__getLastRequest();”函数读取请求字符串。

重要提示:如果您得到 NULL 值,则传递为 参数然后检查您的 .cs(.net) 文件,如下所示:

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

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

示例#1:使用带有单个参数的 php-soap 来实现 HelloYesterday 函数

<?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 来实现 HelloYesterday 函数

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

希望以上示例对您有所帮助。

【讨论】:

    【解决方案2】:

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

    更新: 见NuSOAP and content type

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

    【讨论】:

    • 仅供参考,请忽略错字,仅此而已,php开发人员说他也尝试了您的建议。其他人有什么想法吗?
    • 我实际上将 web 配置更改为 iso-8859-1 没有任何错误,但是当您查看肥皂 xml 信封时,参数为空白,但偶数格式正确
    猜你喜欢
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    • 2010-10-30
    • 2011-02-24
    • 2017-05-22
    • 2011-02-10
    相关资源
    最近更新 更多