分享

【原创】用Visual C 客户端调用Weblogic的Webservice

 素行 2007-05-10
【原创】用Visual C++客户端调用Weblogic的Webservice

提交时间: Nov 10, 2006 1:31:44 PM
加3分   引用 回复   发消息
用Visual C调用weblogic webservice.pdf (75.6 K)


前段时间研究了以下用Visual C++调用weblogic的webservice,发现与调用微软的webservice还是不同的,用其自带的例子无法实现与weblogic的webservice的通讯,下面和大家分享一下实现的方法。
1.首先,需要安装微软的mssoap tookit 3.0工具包,可以从微软的官方网站上下载;
2.使用weblogic的workshop建立一个web服务  。

代码如下所示:
public class add implements com.bea.jws.WebService
{
    static final long serialVersionUID = 1L;

    /**
     * @common:operation
     */
    public int AddNumbers(int NumberOne,int NumberTwo)
    {
        return NumberOne+NumberTwo;
    }
}
仅仅完成一个加法运算即可。
3.查看wsdl文件,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<!-- @editor-info:link autogen="true" source="add.jws" -->
<definitions xmlns="http://schemas./wsdl/" xmlns:conv="http://www./2002/04/soap/conversation/" xmlns:cw="http://www./2002/04/wsdl/conversation/" xmlns:http="http://schemas./wsdl/http/" xmlns:jms="http://www./2002/04/wsdl/jms/" xmlns:mime="http://schemas./wsdl/mime/" xmlns:s="http://www./2001/XMLSchema" xmlns:s0="http://www./" xmlns:soap="http://schemas./wsdl/soap/" xmlns:soapenc="http://schemas./soap/encoding/" targetNamespace="http://www./">
  <types>
    <s:schema elementFormDefault="qualified" targetNamespace="http://www./" xmlns:s="http://www./2001/XMLSchema">
      <s:element name="AddNumbers">
        <s:complexType>
          <s:sequence>
            <s:element name="NumberOne" type="s:int"/>
            <s:element name="NumberTwo" type="s:int"/>
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="AddNumbersResponse">
        <s:complexType>
          <s:sequence>
            <s:element name="AddNumbersResult" type="s:int"/>
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="int" type="s:int"/>
    </s:schema>

  </types>
  <message name="AddNumbersSoapIn">
    <part name="parameters" element="s0:AddNumbers"/>
  </message>
  <message name="AddNumbersSoapOut">
    <part name="parameters" element="s0:AddNumbersResponse"/>
  </message>
  <message name="AddNumbersHttpGetIn">
    <part name="NumberOne" type="s:string"/>
    <part name="NumberTwo" type="s:string"/>
  </message>
  <message name="AddNumbersHttpGetOut">
    <part name="Body" element="s0:int"/>
  </message>
  <message name="AddNumbersHttpPostIn">
    <part name="NumberOne" type="s:string"/>
    <part name="NumberTwo" type="s:string"/>
  </message>
  <message name="AddNumbersHttpPostOut">
    <part name="Body" element="s0:int"/>
  </message>
  <portType name="addSoap">
    <operation name="AddNumbers">
      <input message="s0:AddNumbersSoapIn"/>
      <output message="s0:AddNumbersSoapOut"/>
    </operation>
  </portType>
  <portType name="addHttpGet">
    <operation name="AddNumbers">
      <input message="s0:AddNumbersHttpGetIn"/>
      <output message="s0:AddNumbersHttpGetOut"/>
    </operation>
  </portType>
  <portType name="addHttpPost">
    <operation name="AddNumbers">
      <input message="s0:AddNumbersHttpPostIn"/>
      <output message="s0:AddNumbersHttpPostOut"/>
    </operation>
  </portType>
  <binding name="addSoap" type="s0:addSoap">
    <soap:binding transport="http://schemas./soap/http" style="document"/>
    <operation name="AddNumbers">
      <soap:operation soapAction="http://www./AddNumbers" style="document"/>
      <input>
        <soap:body use="literal"/>
      </input>
      <output>
        <soap:body use="literal"/>
      </output>
    </operation>
  </binding>
  <binding name="addHttpGet" type="s0:addHttpGet">
    <http:binding verb="GET"/>
    <operation name="AddNumbers">
      <http:operation location="/AddNumbers"/>
      <input>
        <http:urlEncoded/>
      </input>
      <output>
        <mime:mimeXml part="Body"/>
      </output>
    </operation>
  </binding>
  <binding name="addHttpPost" type="s0:addHttpPost">
    <http:binding verb="POST"/>
    <operation name="AddNumbers">
      <http:operation location="/AddNumbers"/>
      <input>
        <mime:content type="application/x-www-form-urlencoded"/>
      </input>
      <output>
        <mime:mimeXml part="Body"/>
      </output>
    </operation>
  </binding>
  <service name="add">
    <port name="addSoap" binding="s0:addSoap">
      <soap:address location="http://localhost:7001/add/add.jws"/>
    </port>
    <port name="addHttpGet" binding="s0:addHttpGet">
      <http:address location="http://localhost:7001/add/add.jws"/>
    </port>
    <port name="addHttpPost" binding="s0:addHttpPost">
      <http:address location="http://localhost:7001/add/add.jws"/>
    </port>
  </service>
</definitions>

查看的目的是得到:targetNamespace=http://www./
可以填写在客户端的代码中。

4.运行weblogic workshop的webservice测试工具,通过查看源代码,得到其webservice的地址。注意,这一步和微软的例子是不同的。

得到按钮提交的地址是:http://localhost:7001/add/add.jws/AddNumbers

5.用vc建立一个console的程序,其全部代码如下:
#include <stdio.h>
#include <stdio.h>
#import "msxml4.dll"
using namespace MSXML2;
#import "C:\Program Files\Common Files\MSSoap\Binaries\mssoap30.dll" \
            exclude("IStream", "IErrorInfo", "ISequentialStream", "_LARGE_INTEGER", \
                    "_ULARGE_INTEGER", "tagSTATSTG", "_FILETIME")
using namespace MSSOAPLib30;
void Add()
{
   ISoapSerializerPtr Serializer;
   ISoapReaderPtr Reader;
   ISoapConnectorPtr Connector;
   // Connect to the service.
   Connector.CreateInstance(__uuidof(HttpConnector30));
   Connector->Property["EndPointURL"] = "http://localhost:7001/add/add.jws/AddNumbers";
  
   Connector->Connect();

   // Begin the message.
   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("","STANDARD","");
   Serializer->StartBody("");
   Serializer->StartElement("AddNumbers","http://www./","","");
   //Serializer->StartElement("AddNumbers xmlns=\"http://www./\" ","","","");
   //Serializer->StartElement("AddNumbers","","STANDARD","");
   Serializer->StartElement("NumberOne","http://www./","","");
   Serializer->WriteString("5");
   Serializer->EndElement();
   Serializer->StartElement("NumberTwo","http://www./","","");
   Serializer->WriteString("10");
   Serializer->EndElement();
   Serializer->EndElement();
   Serializer->EndBody();
   Serializer->EndEnvelope();
  
   // Send the message to the XML Web service.
   Connector->EndMessage();     

   // Read the response.
   Reader.CreateInstance(__uuidof(SoapReader30));

   // Connect the reader to the output stream of the connector object.
   Reader->Load(_variant_t((IUnknown*)Connector->OutputStream), "");

   // Display the result.
   printf("Answer: %s\n", (const char*)Reader->RpcResult->text);
   return;
}

int main()
{
   CoInitialize(NULL);
   Add();
   CoUninitialize();
   return 0;
}

6.运行结果,如下:

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多