我在从PHP发送我的WCF Web服务中定义为datacontract的自定义对象时遇到问题。我试图通过SOAP实现这一目标。
以下是dataContract的样子:
[DataContract]
public class simplyCustomer
{
[DataMember]
public int id;
[DataMember]
public string name;
[DataMember]
public string contact;
[DataMember]
public string street1;
[DataMember]
public string street2;
[DataMember]
public string city;
[DataMember]
...
}
所以我有一个函数,它将simpleCustomer作为WCF服务的参数。 php可以使用另一个返回一个的函数接收simplyCustomer
。但是,如果我在PHP中使用此代码调用接受它的那个:
$retVal = $simplyService->__soapCall("addCustomer",array('parameters'=>$params));
此调用生成的SOAP信封使对象返回NULL,导致WCF服务抱怨空引用。
以下是生成的信封:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://tempuri.org/"><SOAP-ENV:Body><ns1:addCustomer/></SOAP-ENV:Body></SOAP-ENV:Envelope>
参数应该在addCustomer
的位置,但那里什么都没有。
非常感谢任何帮助!
谢谢!
答案 0 :(得分:0)
在构建私人项目时我遇到了同样的问题。
我的解决方案是使用T4生成服务和数据合作代理,也许您觉得它很有用。如果您有任何问题,请给我留言,模板未经过全面测试。
您可以在github上找到模板,包括示例servicecontracts / datacontracts:
https://github.com/schaermu/wcf-phpclient-t4
随意分叉项目!
欢呼声
答案 1 :(得分:0)
虽然之前有人问过这个问题,但是在我遇到同样的问题之后,我想加上我的输入。
假设您的操作合同看起来类似于
[OperationContract]
public <return_type> addCustomer(simplyCustomer parameters);
你所建议的应该是有效的,因为$ params在初始化时设置了所有必需的值,而且变量名与数据契约完全相似。
虽然很少有提示。
1)如果您已设法将对象发送到服务,可以检查服务日志以查看出错的地方。
2)只需检查构造函数,看看是否设置了所有参数。
3)还可以检查soap客户端是否已正确初始化和使用。
例如:(以下是许多可能性中的一种)
$client = new Client( $baseUrl, array('soap_version' => SOAP_1_1,));
$result = $client->addCustomer(array("parameters" => $params ));
答案 2 :(得分:0)
我遇到了同样的问题。不知道你是如何建立你的$ params但我解决了我的问题:
$username = "test";
$password = "test";
$input = array ("composite" => array("Password" => $password, "UserName" => $username));
$result=$client->__SoapCall('AuthenticateUser',array('parameters'=>$input));
我的服务方法如下所示
[OperationContract]
AuthenticationData AuthenticateUser(AuthenticationData composite);
在弄清楚如何构建肥皂的时候,使用Fiddler是一个很好的帮助