各位大侠帮帮忙啊,我在用VC6.0调用webservice的时候总是返回soap:client是怎么回事啊?谁有遇到过这种情况啊?

时间:2022-08-13 20:09:27
各位大侠帮帮忙啊,我在用VC6.0调用webservice的时候总是返回soap:client是怎么回事啊?谁有遇到过这种情况啊?

7 个解决方案

#1


首先强烈不建议使用vc6来操作SOAP,没有编译器提供的proxy object,你的编码很可能不符合实际的schema,出错容易查错难。至少应该使用VS2005才好。

如果没得选择,你至少得弄明白这个错误信息是谁弹出得。基本上不调试是不可能知道错误原因得。说不定你得代码自己都能显示这样得错误信息,那么谁能猜测出你在什么时候弹出它呢?

#2



连接代码
void SmsSendWEB::ConnectInternet()
{
HRESULT hr=Connector.CreateInstance(__uuidof(HttpConnector30)); //创建连接实例
if(!SUCCEEDED(hr))
{  
AfxMessageBox("无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库!");
return ;
}
Connector->Property["EndPointURL"]="http://10.37.128.206:8017/hajgsms.asmx";//连接属性得到将要进行连接的URL
Connector->Connect();//和服务器连接 

// Begin message 
// Connector->Property["SoapAction"] = _bstr_t(NameSpace)+"/"+_bstr_t(method);
Connector->Property["SoapAction"] ="http://tempuri.org/SendSms";//将要进行的操作
Connector->BeginMessage(); //开始准备发送消息
}

发送消息的代码:
void SmsSendWEB::TransMessage(char *ShortMsgContent,char *recvNo,char *SendTime)
{
HRESULT hr=Serializer.CreateInstance(__uuidof(SoapSerializer30));//创建一个Serializer实例 
if(!SUCCEEDED(hr))
{  
AfxMessageBox("无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库!");
return ;
}
// 将serializer连接到connector的输入字符串 
Serializer->Init(_variant_t((IUnknown*)Connector->InputStream)); 

// 创建SOAP消息                   
Serializer->StartEnvelope("soap","http://schemas.xmlsoap.org/soap/envelope/","");
Serializer->SoapAttribute("xsi", "", "http://www.w3.org/2001/XMLSchema-instance", "xmlns");                                       
Serializer->SoapAttribute("xsd", "", "http://www.w3.org/2001/XMLSchema", "xmlns");
Serializer->StartBody("Body"); 

Serializer->StartElement("SendSms","http://tempuri.org/","","");// 方法+命名空间

Serializer->StartElement("SenderMobileNumber","http://tempuri.org/","",""); 
Serializer->SoapAttribute("xsi:type","","xsd:string","");
Serializer->WriteString(recvNo); //传入手机号码
Serializer->EndElement(); 

Serializer->StartElement("Contents","http://tempuri.org/","","");
Serializer->SoapAttribute("xsi:type","","xsd:string","");
Serializer->WriteString(ShortMsgContent); //传入短信内容
Serializer->EndElement();

Serializer->StartElement("SendDateTime","http://tempuri.org/","",""); 
Serializer->SoapAttribute("xsi:type","","xsd:dateTime","");
Serializer->WriteString(SendTime); //传入时间
Serializer->EndElement();

Serializer->StartElement("LicenceKey","http://tempuri.org/","",""); 
Serializer->SoapAttribute("xsi:type","","xsd:string","");
Serializer->WriteString("HAJG"); //传入授权码
Serializer->EndElement();
 
Serializer->EndElement();
Serializer->EndBody(); 
Serializer->EndEnvelope(); 

try
{
// Send the message to the web service 
Connector->EndMessage(); //向网站发送消息
ConnectSuccess=true;
}
catch(_com_error e) 
{
MessageBox(NULL,e.Description(),0,NULL);
MessageBox(NULL,"请检查网络连接!","Butterfly Warning",NULL);
ConnectSuccess=false;
        return ;

}
HRESULT hr2=Reader.CreateInstance(__uuidof(SoapReader30)); 
if(!SUCCEEDED(hr2))
{  
AfxMessageBox("无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库!");
cout<<"ERROR";
return ;
}
Reader->Load(_variant_t((IUnknown*)Connector->OutputStream), "");
string str;
//这里返回消息,应该是true或者false,但返回的是soap:client,不知道是咋回事。
str=(const char*)Reader->RpcResult->text;
}

#3


绝大多数COM组件都时用BSTR而不是普通字符串做参数的,因此你这里所有的字符串都值得怀疑

#4


引用 3 楼 arong1234 的回复:
绝大多数COM组件都时用BSTR而不是普通字符串做参数的,因此你这里所有的字符串都值得怀疑


#5


不是BSTR字符串的问题,我用_bstr_t()函数还是不行的
是时间字符串的问题,这个dateTime类型怎么传啊?我用的“xxxx-xx-xx xx:xx:xx”的格式,报错如下:
不是有效的 AllXsd 值。
   在 System.Xml.Schema.XsdDateTime..ctor(String text, XsdDateTimeFlags kinds)
   在 System.Xml.XmlConvert.ToDateTime(String s, XmlDateTimeSerializationMode dateTimeOption)


全部报错内容:
<soap:Body xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Fault>
<faultcode>soap:Client</faultcode>
<faultstring>System.Web.Services.Protocols.SoapException: 服务器无法读取请求。 
---&gt; System.InvalidOperationException: XML 文档(1, 870)中有错误。 
---&gt; System.FormatException: 字符串“2.00”不是有效的 AllXsd 值。
   在 System.Xml.Schema.XsdDateTime..ctor(String text, XsdDateTimeFlags kinds)
   在 System.Xml.XmlConvert.ToDateTime(String s, XmlDateTimeSerializationMode dateTimeOption) 

#6


好像格式是:xxxx-xx-xxTxx:xx:xx,先试试看看

#7


引用 6 楼 liuzh501448 的回复:
好像格式是:xxxx-xx-xxTxx:xx:xx,先试试看看


好用啊~~ 这个不错,用LOADRUNNER测WS的时候就因为这个时间格式的问题,耽误了20分钟。谢谢

#1


首先强烈不建议使用vc6来操作SOAP,没有编译器提供的proxy object,你的编码很可能不符合实际的schema,出错容易查错难。至少应该使用VS2005才好。

如果没得选择,你至少得弄明白这个错误信息是谁弹出得。基本上不调试是不可能知道错误原因得。说不定你得代码自己都能显示这样得错误信息,那么谁能猜测出你在什么时候弹出它呢?

#2



连接代码
void SmsSendWEB::ConnectInternet()
{
HRESULT hr=Connector.CreateInstance(__uuidof(HttpConnector30)); //创建连接实例
if(!SUCCEEDED(hr))
{  
AfxMessageBox("无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库!");
return ;
}
Connector->Property["EndPointURL"]="http://10.37.128.206:8017/hajgsms.asmx";//连接属性得到将要进行连接的URL
Connector->Connect();//和服务器连接 

// Begin message 
// Connector->Property["SoapAction"] = _bstr_t(NameSpace)+"/"+_bstr_t(method);
Connector->Property["SoapAction"] ="http://tempuri.org/SendSms";//将要进行的操作
Connector->BeginMessage(); //开始准备发送消息
}

发送消息的代码:
void SmsSendWEB::TransMessage(char *ShortMsgContent,char *recvNo,char *SendTime)
{
HRESULT hr=Serializer.CreateInstance(__uuidof(SoapSerializer30));//创建一个Serializer实例 
if(!SUCCEEDED(hr))
{  
AfxMessageBox("无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库!");
return ;
}
// 将serializer连接到connector的输入字符串 
Serializer->Init(_variant_t((IUnknown*)Connector->InputStream)); 

// 创建SOAP消息                   
Serializer->StartEnvelope("soap","http://schemas.xmlsoap.org/soap/envelope/","");
Serializer->SoapAttribute("xsi", "", "http://www.w3.org/2001/XMLSchema-instance", "xmlns");                                       
Serializer->SoapAttribute("xsd", "", "http://www.w3.org/2001/XMLSchema", "xmlns");
Serializer->StartBody("Body"); 

Serializer->StartElement("SendSms","http://tempuri.org/","","");// 方法+命名空间

Serializer->StartElement("SenderMobileNumber","http://tempuri.org/","",""); 
Serializer->SoapAttribute("xsi:type","","xsd:string","");
Serializer->WriteString(recvNo); //传入手机号码
Serializer->EndElement(); 

Serializer->StartElement("Contents","http://tempuri.org/","","");
Serializer->SoapAttribute("xsi:type","","xsd:string","");
Serializer->WriteString(ShortMsgContent); //传入短信内容
Serializer->EndElement();

Serializer->StartElement("SendDateTime","http://tempuri.org/","",""); 
Serializer->SoapAttribute("xsi:type","","xsd:dateTime","");
Serializer->WriteString(SendTime); //传入时间
Serializer->EndElement();

Serializer->StartElement("LicenceKey","http://tempuri.org/","",""); 
Serializer->SoapAttribute("xsi:type","","xsd:string","");
Serializer->WriteString("HAJG"); //传入授权码
Serializer->EndElement();
 
Serializer->EndElement();
Serializer->EndBody(); 
Serializer->EndEnvelope(); 

try
{
// Send the message to the web service 
Connector->EndMessage(); //向网站发送消息
ConnectSuccess=true;
}
catch(_com_error e) 
{
MessageBox(NULL,e.Description(),0,NULL);
MessageBox(NULL,"请检查网络连接!","Butterfly Warning",NULL);
ConnectSuccess=false;
        return ;

}
HRESULT hr2=Reader.CreateInstance(__uuidof(SoapReader30)); 
if(!SUCCEEDED(hr2))
{  
AfxMessageBox("无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库!");
cout<<"ERROR";
return ;
}
Reader->Load(_variant_t((IUnknown*)Connector->OutputStream), "");
string str;
//这里返回消息,应该是true或者false,但返回的是soap:client,不知道是咋回事。
str=(const char*)Reader->RpcResult->text;
}

#3


绝大多数COM组件都时用BSTR而不是普通字符串做参数的,因此你这里所有的字符串都值得怀疑

#4


引用 3 楼 arong1234 的回复:
绝大多数COM组件都时用BSTR而不是普通字符串做参数的,因此你这里所有的字符串都值得怀疑


#5


不是BSTR字符串的问题,我用_bstr_t()函数还是不行的
是时间字符串的问题,这个dateTime类型怎么传啊?我用的“xxxx-xx-xx xx:xx:xx”的格式,报错如下:
不是有效的 AllXsd 值。
   在 System.Xml.Schema.XsdDateTime..ctor(String text, XsdDateTimeFlags kinds)
   在 System.Xml.XmlConvert.ToDateTime(String s, XmlDateTimeSerializationMode dateTimeOption)


全部报错内容:
<soap:Body xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Fault>
<faultcode>soap:Client</faultcode>
<faultstring>System.Web.Services.Protocols.SoapException: 服务器无法读取请求。 
---&gt; System.InvalidOperationException: XML 文档(1, 870)中有错误。 
---&gt; System.FormatException: 字符串“2.00”不是有效的 AllXsd 值。
   在 System.Xml.Schema.XsdDateTime..ctor(String text, XsdDateTimeFlags kinds)
   在 System.Xml.XmlConvert.ToDateTime(String s, XmlDateTimeSerializationMode dateTimeOption) 

#6


好像格式是:xxxx-xx-xxTxx:xx:xx,先试试看看

#7


引用 6 楼 liuzh501448 的回复:
好像格式是:xxxx-xx-xxTxx:xx:xx,先试试看看


好用啊~~ 这个不错,用LOADRUNNER测WS的时候就因为这个时间格式的问题,耽误了20分钟。谢谢