【问题标题】:how to send an object to C# WCF service from PHP using SOAP如何使用 SOAP 从 PHP 将对象发送到 C# WCF 服务
【发布时间】:2010-07-21 06:45:24
【问题描述】:

我在从 PHP 发送一个在我的 WCF Web 服务中定义为数据契约的自定义对象时遇到问题。我正在尝试通过 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 信封使对象为空,导致 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所在的位置,但那里什么都没有。

任何帮助将不胜感激!

谢谢!

【问题讨论】:

标签: c# php wcf soap


【解决方案1】:

我在构建私人项目时遇到了同样的问题。

我的解决方案是使用 T4 来生成服务和数据合同代理,也许你会觉得它很有用。如果您有任何问题,请给我留言,这些模板没有经过全面测试。

您可以在 github 上找到模板,包括示例 servicecontracts/datacontracts:

https://github.com/schaermu/wcf-phpclient-t4

随意分叉项目!

干杯

【讨论】:

    【解决方案2】:

    虽然之前有人问过这个问题,但由于我遇到了同样的问题,所以想添加我的输入。

    假设您的运营合同类似于

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

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题。看不到您是如何构建 $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);
      

      在弄清楚如何构建 Soap 东西时,使用 Fiddler 是一个很好的帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多