VC调用WebService

本文介绍了如何在VC中调用WebService进行数据交互。通过创建ISoapSerializer、ISoapReader和ISoapConnector对象,连接并发送SOAP消息到指定的WebService,获取响应后解析XML数据填充到组合框中。同时,强调了在WebService端设置soapRPCMethod属性以确保在VC中正确调用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在cpp文件里:
void CMyTreeViewDlg::AddMajor()
{
   ISoapSerializerPtr Serializer;
   ISoapReaderPtr Reader;
   ISoapConnectorPtr Connector;
   // Connect to the service.
   Connector.CreateInstance(__uuidof(HttpConnector30));
   Connector->Property["EndPointURL"] = "http://localhost/WS_ELearning/NECServices/WSJiaoWu/AdditionalWS.asmx?wsdl";
   Connector->Connect();


//<?xml version="1.0" encoding="utf-8"?>
//<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
//  <soap:Body>
//    <ListAllMajorsByObjectID xmlns="http://tempuri.org/ELearning/AdditionalWS">
//      <ObjectID>string</ObjectID>
//    </ListAllMajorsByObjectID>
//  </soap:Body>
//</soap:Envelope>

   // Begin the message.
   //Connector->Property["SoapAction"] = "uri:AddNumbers";
   Connector->Property["SoapAction"] = "http://tempuri.org/ELearning/AdditionalWS/ListAllMajorsByObjectID";
   Connector->BeginMessage();

   // Create the SoapSerializer object.
   Serializer.CreateInstance(__uuidof(SoapSerializer30));

   // Connect the serializer object to the input stream of the connector object.
   Serializer->Init(_variant_t((IUnknown*)Connector->InputStream));

   // Build the SOAP Message.
   Serializer->StartEnvelope("SOAP","","");
   Serializer->StartBody("");
   Serializer->StartElement("ListAllMajorsByObjectID ","http://tempuri.org/ELearning/AdditionalWS","","");
   Serializer->StartElement("ObjectID","","","");
   Serializer->WriteString(L"11");
   Serializer->EndElement();
 
   Serializer->EndElement();
   Serializer->EndBody();
   Serializer->EndEnvelope();
 

   Connector->EndMessage();     

   Reader.CreateInstance(__uuidof(SoapReader30));

   Reader->Load(_variant_t((IUnknown*)Connector->OutputStream), "");

   _bstr_t result=Reader->RpcResult->text;

 MSXML2::IXMLDOMDocumentPtr pXMLDom;

    HRESULT hr;

    CoInitialize(NULL);

    hr = pXMLDom.CreateInstance(__uuidof(DOMDocument40));
    if (FAILED(hr))
    {
       printf("Failed to instantiate DOMDocument40 class/n");
       return ;
    }
 pXMLDom->async = VARIANT_FALSE;
   if ( pXMLDom->loadXML(result) != VARIANT_TRUE)
   {
      printf("Failed load xml data from file./n%s/n",(LPCSTR)pXMLDom->parseError->Getreason());
      return ;
   }

   _bstr_t nodeName="MAJORNAME";
   _bstr_t nodeID="MAJORID";
  
   MSXML2::IXMLDOMNodeListPtr pNodeList = pXMLDom->getElementsByTagName(nodeName);
  
   int nList = pNodeList->length;
   MSXML2::IXMLDOMNodeListPtr pNodeValueList =pXMLDom->getElementsByTagName(nodeID);
       CComboBox *combo=(CComboBox *)this->GetDlgItem(IDC_COMBO1);
 for( int n = 0; n < nList; n++ )
 {
  MSXML2::IXMLDOMNodePtr pNode = pNodeList->item[n];
  MSXML2::IXMLDOMNodePtr pNodeValue = pNodeValueList->item[n];
       bstr_t bsNodeText = pNode->text;

    //CString *buf;

    bstr_t bsNodeValue=pNodeValue->text ;
 //   buf=(CString *)pNodeValue->text ;

    BSTR bstrValue = ::SysAllocString(bsNodeValue);
    char * buf = _com_util::ConvertBSTRToString(bstrValue);

    //buf=bsNodeText;
    //combo->AddString("aaa");

    //combo->SetDlgItemText(n+1,"111");
    //CString aaa="231231";

    combo->AddString(bsNodeText);
    combo->SetWindowText(buf);
    combo->SetDlgItemText(IDC_COMBO1,buf); //SetDlgItemText(IDC_CBO1,str);
   //SetItemData(index, data[i].value);
   combo->SetItemData(n,(DWORD) buf);
  
   
 }
 

combo->SetCurSel(0);

}


然后修改WebService,添加soapRPCMethod()属性,表示采用RPC调用模式,只有这样,才可以在VC里通过soap调用的方法调用,否则调用进来的参数为Nothing。

 <SoapRpcMethod(), WebMethod(Description:="通过ObjectID来显示所有的专业")> Public Function ListAllMajorsByObjectID(ByVal ObjectID As String) As String
        Dim jwfacade As New NECBusinessFacade.ELearning.JWBusinessFacade.OMGSystem
        Dim ds As DataSet = jwfacade.ListMajorsByObjectIDFromMajor(ObjectID, False)
        Return ds.GetXml()
    End Function

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值