Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么php不能与WCF 4.0 asp网站一起使用WCF服务?_Php_Wcf_Wcf Binding_Wcf Client - Fatal编程技术网

为什么php不能与WCF 4.0 asp网站一起使用WCF服务?

为什么php不能与WCF 4.0 asp网站一起使用WCF服务?,php,wcf,wcf-binding,wcf-client,Php,Wcf,Wcf Binding,Wcf Client,好的,我的.NET4.0客户端工作正常。使用java的人都没有问题。但是当涉及到php时,我们的php开发人员无法获得任何工作 现在请记住,我没有创建一个Wcflibray项目,我创建了一个常规的asp 4.0网站,然后添加了一个WCF服务,所以我没有app.config,我有一个web.config 我们已经讨论了创建两种方法的基本要素 string HelloWorld() { return "Hello!"; } 及 在调试模式下,我将看到他输入我的方法,但只使用null。如果我用wir

好的,我的.NET4.0客户端工作正常。使用java的人都没有问题。但是当涉及到php时,我们的php开发人员无法获得任何工作

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

我们已经讨论了创建两种方法的基本要素

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

在调试模式下,我将看到他输入我的方法,但只使用null。如果我用wireshark嗅包,他就不会通过paramater信封

我在谷歌上搜索了无数次,但所有的例子都来自一个WCF服务项目,而不是一个也添加了WCF服务的网站。(请记住,其他人都没有问题,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); 


?>

由于您正在将wsdl位置传递到
SoapClient
构造函数中,因此应该能够调用
$client->hellotorrow($args)
。不过,似乎有一些输入错误,您能否验证它们在实际代码中是否都是正确的?在web服务代码中,将函数命名为
helloworrow
,但在PHP代码中调用的是
hellotorrow
。此外,该参数在web服务中命名为
sret
,但在
$args
关联数组中作为
param1
传递。调用不需要任何参数的
HelloWorld()
是否有效

更新: 看


尝试使用内置的PHP SoapClient而不是NuSOAP版本。PHP的SoapClient看起来默认为UTF-8,其中NuSOAP似乎硬编码为ISO-8859-1,而使用WCF服务.net作为服务器和PHP soap作为客户端时,您需要严格遵守指南。PHPSOAP的文档还不足以进行调试,也不够清晰。PHP nusoap在文档方面稍有改进,但在示例方面仍然不够,对于初学者来说不是一个好的选择。nusoap有几个例子,但大多数都不起作用。 我建议使用以下调试清单:

  • 检查web.config文件中的绑定。对于PHP,它必须是“basicHttpBinding
  • PHP,$client->\uuu soapCall()函数将所有参数作为数组发送,因此如果web服务函数需要输入参数作为数组,则参数必须位于额外的数组中。下面给出了示例#3,以澄清问题
  • 如果需要,则将“array('soap\u version'=>soap\u 1\u 1)”或“array('soap\u version'=>soap\u 1\u 2)”传递给SoapClient()对象以显式声明soap版本
  • 始终尝试向SoapClient对象声明“array(“trace”=>1)”以读取请求和响应字符串
  • 使用“\uu getLastResponse();”函数读取响应字符串
  • 使用“”函数读取请求字符串
  • 重要提示:如果传递为的任何值都返回空值 参数,然后检查如下所示的.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);
    ?>
    
    <?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>';
    ?>
    
    PHP代码

    \uuu getLastResponse();
    $requXML=$client->_getLastRequest();
    回显“请求:
    ”; 变量转储($reqxml); 回应“响应:
    ”; 变量转储($respXML); ?>

    希望以上示例能有所帮助。

    您的WCF服务使用哪种绑定?我看到您的PHP客户端使用SOAP1.1,在WCF中,只有basicHttpBinding将与此标准兼容。至于绑定问题,我如何才能真正确定?它没有在我的wsdl、web.config或代码中定义。以上就是您看到的内容。这是web.config,这是一个正在运行的.net 4.0客户端app.cofig错误HTTP错误:不受支持的HTTP响应状态415无法处理消息,因为内容类型为“text/xml;charset=ISO-8859-1“不是预期的类型”text/xml;字符集=utf-8'。(soapclient->response包含响应的内容)Request POST/DynamicWCFService.svc HTTP/1.0主机:99-mxl9461k9f:6062用户代理:NuSOAP/0.9.5(1.123)内容类型:text/xml;charset=ISO-8859-1 SOAPAction:“内容长度:389是更改字符集的问题。我忽略输入错误,仅此而已,php开发人员说他也尝试了您建议的内容。其他人有什么想法吗?我实际上在web配置中更改为iso-8859-1,没有错误,但是当您查看soap xml信封时,parmater是空的,但是evenloper的格式正确
    <?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>';
    ?>
    
       [ServiceContract]
        public interface IDynamicWCFService
        {
            [OperationContract]
            string[] HelloYesterday (string[] testA, string testB, int testC );
        }
    
    <?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);
    ?>