请问一下,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] =>
)
<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] =>
)
我在试的时候,发现他好像是与C#的枚举有关系:如:TradeType,他主要不是为字符串形式,但是我不知道怎么用PHP来表示枚举。谢谢各位了。