如何使用SOAP从PHP向C#WCF服务发送对象

时间:2010-07-21 06:45:25

标签: c# php wcf soap

我在从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的位置,但那里什么都没有。

非常感谢任何帮助!

谢谢!

3 个答案:

答案 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是一个很好的帮助