我在给一个WebService发送一个SOAP消息报文的时候总是不能接收到正确的参数。调试了半天才发现
ISoapSerializer生成的消息是:
<?xml version="1.0" encoding="utf-8" standalone="no" ?> 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
 <soap:Body>
 <SOAPSDK1:Add xmlns:SOAPSDK1="http://tempuri.org/">
  <N1>2</N1> 
  <N2>3</N2> 
  </SOAPSDK1:Add>
 </soap:Body>
</soap:Envelope>
和WebService要求的多了一个SOAPSDK1的命名空间前缀,当我去掉SOAPSDK1并通过telnet发送给WebService的时候,成功了所以我的问题是,我怎么不让他出现SOAPSDK1呢?
代码如下
ISoapConnectorPtr Connector;
Connector.CreateInstance(__uuidof(HttpConnector));
Connector->Property["EndPointURL"]="http://localhost/dotNET/index.asmx";
Connector->Connect();ISoapSerializerPtr Serializer;
ISoapReaderPtr Reader;Connector->Property["SoapAction"]=("http://tempuri.org/Add").c_str();
Connector->BeginMessage();
// 创建SoapSerializer对象
Serializer.CreateInstance(__uuidof(SoapSerializer));
// 将serializer连接到connector的输入字符串
Serializer->Init(_variant_t((IUnknown*)Connector->InputStream));
//Create SOAP Message
Serializer->startEnvelope("soap",_bstr_t(),"utf-8");
Serializer->startBody(_bstr_t());
Serializer->startElement("Add","http://tempuri.org/","NONE","");
Serializer->startElement("N1","","NONE","");
Serializer->writeString("2");
Serializer->endElement();
Serializer->startElement("N2","","NONE","");
Serializer->writeString("3");
Serializer->endElement();
Serializer->endElement();
Serializer->endBody();
Serializer->endEnvelope();
//Send message to web service
Connector->EndMessage();
//Read response
Reader.CreateInstance(__uuidof(SoapReader));
// 将reader联接到connector的输出字符串
Reader->Load(_variant_t((IUnknown*)Connector->OutputStream), "");
return (char*)Reader->RPCResult->xml;
详细情况看这里:
http://community.csdn.net/Expert/TopicView3.asp?id=4133368

解决方案 »

  1.   

    另外我要传递一个可选参数给一个BSTR参数类型的函数,该怎么办?VT_ERROR的VARIANT似乎不能转换成_bstr_t
      

  2.   

    问题已经找到原来问题在Serializer,生成的方法调用的节点前面总是有前缀SOAPSDK1或者我自己定义的,如何去掉前缀?或者让C#的Web Service接受这个前缀?
      

  3.   

    mssoap?  toolkit2.0好像没这样的问题
    Serializer->startElement("Add","http://tempuri.org/","NONE","");后面的三个参数都写空试试