为什么php不能与WCF 4.0 asp网站一起使用WCF服务?
好的,我的.NET4.0客户端工作正常。使用java的人都没有问题。但是当涉及到php时,我们的php开发人员无法获得任何工作 现在请记住,我没有创建一个Wcflibray项目,我创建了一个常规的asp 4.0网站,然后添加了一个WCF服务,所以我没有app.config,我有一个web.config 我们已经讨论了创建两种方法的基本要素为什么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
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有几个例子,但大多数都不起作用。 我建议使用以下调试清单:
[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);
?>