请问一下,PHP调用C#的webservice时,如果有多个参数,并且一个参数是一个对象public int CreateGoldOrder(string GameTag, string ServerName,string FractionName, GoldOrder model)GoldOrder 是继承了Order类的一些属性。现在我有几个疑问:1,为什么在soap里面根本就没有Order 的属性在里面。如: <CreateGoldOrder xmlns="http://tempuri.org/">
      <GameTag>string</GameTag>
      <ServerName>string</ServerName>
      <FractionName>string</FractionName>
      <model>
        <GoldCount>int</GoldCount>
        <TradeType>FaceToFace or TrustedTrade or TransferAccount</TradeType>
        <AccountInfo>
          <AccountName>string</AccountName>
          <Password>string</Password>
        </AccountInfo>
        <LimitSendTime>int</LimitSendTime>
        <OnlineState>Null or Normal or Online or HaveAccount</OnlineState>
        <OnlineTimes>
          <OnlineTime>
            <From>dateTime</From>
            <To>dateTime</To>
          </OnlineTime>
          <OnlineTime>
            <From>dateTime</From>
            <To>dateTime</To>
          </OnlineTime>
        </OnlineTimes>
        <CharacterName>string</CharacterName>
        <GameCurrencyTypeId>int</GameCurrencyTypeId>
        <IsOutOrder>boolean</IsOutOrder>
        <IsFinishEmailSended>boolean</IsFinishEmailSended>
      </model>
按理说GoldOrder应该有Order的一些属性。2,在用PHP调用C#的webservice时创建订单时,他根本就创建不了订单,不管我是只要GoldOrder的属性,还是把Order表里面的属性都加上也都不能创建成功。注:我的PHP方法是没有问题的,我测试Hello World方法能够成功。
我觉得这个问题应该是出现在Model里面的参数问题。<html>
<head>
<title>My Php Item</title>
</head>
<body>
<?php
header("Content-Type: text/html;charset=utf-8");
require_once('lib/nusoap.php');    //必须添加这个SOAP文件
//$client = new soapclient('http://19.82.4.106:8099/Service1.asmx?wsdl', true);  //建立soap客户端
$client = new soapclient('http://19.82.4.106:8001/OrderCenter.asmx?wsdl', true);  //建立soap客户端
$client->soap_defencoding = 'utf-8';
$client->decode_utf8 = false;/**
* 远程调用
*/
$err = $client->getError();  
if ($err) {
echo '<h2>Constructor error</h2><pre>' . $err . '</pre>';
echo '<h2>Debug</h2><pre>' . htmlspecialchars($client->getDebug(), ENT_QUOTES) . '</pre>';
exit();
}
try
{
//$result = $client -> call('HelloWorld',array('msg' => ' 11'));

   $result  = $client -> call('CreateGoldOrder',array('GameTag'=>'WOW-DE','ServerName'=>'Aegwynn','FractionName'=>'Horde',
   'model'=>array(
   //Order 的属性
   'Source'=>array('Name'=>'Web-Metin2pro.com','Id'=>14)
   ,'OrderType'=>'Gold'
   ,'Price'=>1.00
   ,'CustomerName' =>'jiguixin'
   ,'WebOrderNo' =>'EN_G_20090808100003'
   ,'CustomerMail'=>'[email protected]'
   ,'OrderState'=>'NewOrder'
   ,'IsForeign'=>true
   ,'Deleted'=>false
   ,'CreateTime'=>'2009-08-08T18:52:55.75+08:00'
   //GoldOrder 的属性
   ,'TradeType' =>'TransferAccount'
   ,'AccountInfo'=>array('AccountName'=>'jiguixin110','Password'=>'132465789add')
   ,'GoldCount'=>5
   ,'LimitSendTime'=>0
   ,'OnlineState'=>'HaveAccount'
   ,'OnlineTimes'=>array('OnlineTime' =>array('From'=>'2009-08-08T18:52:55.75+08:00','To'=>'2009-08-09T18:52:55.75+08:00')
   ,'OnlineTime' =>array('From'=>'2009-08-19T18:52:55.75+08:00','To'=>'2009-08-29T18:52:55.75+08:00')
   )
   ,'CharacterName'=>'black'
   ,'GameCurrencyTypeId'=>2
   ,'IsOutOrder'=>false
   ,'IsFinishEmailSended'=>false
     )
    )
    );  //调用WEB方法
    
   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>';
       print_r($result);       
  }
}   
}
catch(Exception $e)
{
print $e;
}
?>
</body>
</html>我在浏览器里面他出现这种错误,我在VS2008里面也不能进行他传过来的调试。浏览器中的错误信息:
Fault
Array
(
    [faultcode] => soap:Client
    [faultstring] => System.Web.Services.Protocols.SoapException: 服务器无法读取请求。 ---> System.InvalidOperationException: XML 文档(1, 995)中有错误。 ---> System.FormatException: 输入字符串的格式不正确。
   在 System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
   在 System.Number.ParseDecimal(String value, NumberStyles options, NumberFormatInfo numfmt)
   在 System.Xml.XmlConvert.ToDecimal(String s)
   在 Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReader1.Read5_NullableOfDecimal(Boolean checkType)
   在 Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReader1.Read21_GoldOrder(Boolean isNullable, Boolean checkType)
   在 Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReader1.Read26_CreateGoldOrder()
   在 Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer.Deserialize(XmlSerializationReader reader)
   在 System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
   --- 内部异常堆栈跟踪的结尾 ---
   在 System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
   在 System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle)
   在 System.Web.Services.Protocols.SoapServerProtocol.ReadParameters()
   --- 内部异常堆栈跟踪的结尾 ---
   在 System.Web.Services.Protocols.SoapServerProtocol.ReadParameters()
   在 System.Web.Services.Protocols.WebServiceHandler.CoreProcessRequest()
    [detail] => 
)

解决方案 »

  1.   

    System.FormatException: 输入字符串的格式不正确。 
    我在试的时候,发现他好像是与C#的枚举有关系:如:TradeType,他主要不是为字符串形式,但是我不知道怎么用PHP来表示枚举。谢谢各位了。
      

  2.   

    这个问题是,在PHP调用C#的webservice时,因为有些类型参数没有传完。特别是datetime的类型,必须指定完,因为PHP不会有默认值。把所有的类型加完就能完成创建订单的操作了。