天天看點

JAVA調用C#開發WebService示例

摘要:

多程式設計語言之間互相調用的情況很常見,這裡是一則Java調用C#程式編寫的WebService示例.

環境:

 JAVA:  Eclipse Kepler Service Release 1

 引用類庫:Axis1.0、Log4J

 以下為MetaInfo.

Class-Path:

 lib/axis.jar

 lib/jaxrpc.jar  

 lib/mail.jar  

 lib/saaj.jar  

 lib/wsdl4j-1.5.1.jar  

 lib/commons-discovery-0.2.jar  

 lib/commons-logging-1.0.4.jar  

 lib/dom4j-1.6.1.jar  

 lib/jaxen-1.1.1.jar  

 lib/log4j-1.2.13.jar  

 lib/slf4j-api-1.5.2.jar  

 lib/slf4j-nop-1.5.2.jar

關鍵點:

1.call.setOperationName必須做QName轉化(命名空間NameSpace識别用);

2.call.addParameter一定不能用QName轉化,如果做過轉化,會導緻WebService無法識别入口參數;

3.call.setUseSOAPAction(true);

call.setSOAPActionURI(wsdl_Qname + method);

詳細說明:

通過WSDL檔案,解讀入口參數、傳回類型等.

比如c#Webservice提供一個 UpdateCheckItemsState 過程,在wsdl中:

- <wsdl:message name="UpdateCheckItemsStateSoapIn">

  <wsdl:part name="patient_id" type="s:string" />

  </wsdl:message>

- <wsdl:message name="UpdateCheckItemsStateSoapOut">

  <wsdl:part name="UpdateCheckItemsStateResult" type="s:boolean" />

  </wsdl:message>

裡面就是入口參數和傳回結果,分别是String和Boolean型.

以下為示例代碼:

import java.net.URL;

import javax.xml.namespace.QName;

import javax.xml.rpc.ParameterMode;

import org.apache.axis.client.Call;

import org.apache.axis.client.Service;

import org.apache.axis.encoding.XMLType;

import org.apache.log4j.Logger;

// 狀态更新

    private void UpdateCheckItemsState () {

        // 讀取wsdl

        remoteUrl = "http://192.168.0.199/WsPacsTrans.asmx?wsdl";

        if ((remoteUrl == null) || (remoteUrl.isEmpty())) {

             System.out.println("remotewsdl為空");

             return;

        }

        try {

            Service myservice = new Service();

            Call call = (Call) myservice .createCall();

            call.setEncodingStyle(null);

            call.setProperty(org.apache.axis.client.Call.SEND_TYPE_ATTR,

                    Boolean.FALSE);

            call.setProperty(org.apache.axis.AxisEngine.PROP_DOMULTIREFS,

                    Boolean.FALSE);

            call.setSOAPVersion(org.apache.axis.soap.SOAPConstants.SOAP11_CONSTANTS);

            String wsdl_Qname = "";

            String method = "UpdateCheckItemsState";

            wsdl_Qname = "http://www.yourname.com/";//此處用wsdl實際的NameSpace名稱

            // setOperationName 必須做QName轉化

            call.setOperationName(new QName(wsdl_Qname, method));

            // 入口參數- patient_id,此處不能做QName轉化處理

            call.addParameter("patient_id",

                    XMLType.XSD_STRING, ParameterMode.IN);

            // 傳回參數

            call.setReturnType(XMLType.XSD_BOOLEAN);

            call.setUseSOAPAction(true);

            call.setSOAPActionURI(wsdl_Qname + method);

            call.setTargetEndpointAddress(new URL(remoteUrl));

            boolean result = (boolean) call.invoke(new Object[] { "12342234" });// 12342234 為測試值,實際運作時傳遞需要的值

            log.info("狀态更新結果:" + result);

        } catch (Exception e) {

            e.printStackTrace();

            log.error("狀态更新出錯:" + e.toString());

        }

    }

後記:

1.注意類庫的版本,如果出現莫名其妙的問題,首先要分析這個原因;

2.其它調試要點歡迎大家分享、補充。

轉載于:https://my.oschina.net/yilaoyu/blog/700123