1. 程式人生 > >關於java呼叫webservice引數傳遞為空問題

關於java呼叫webservice引數傳遞為空問題

    通過Myeclipse10.0 jdk1.7呼叫VS2012 webService遇到java客戶端引數傳遞不過去的問題,搞了一下午終於出結果了,其實網上好多方法都只是一部分,需要綜合一下。


客戶端我是用import org.apache.axis.client.Call;方法呼叫服務成功解決該問題的的,通過RPCServiceClient以及axis2自動生成的stub呼叫均未找到合適的傳遞引數的方法


client:

import java.net.MalformedURLException;
import java.rmi.RemoteException;

import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;
import javax.xml.rpc.ServiceException;

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;

public class test4 {
 public static void main(String[] args) throws RemoteException, MalformedURLException, ServiceException {
  String service_url = "

http://localhost:30332/WebService1.asmx";
  Service ser = new Service();
  Call call = (Call) ser.createCall();
  call.setTargetEndpointAddress(new java.net.URL(service_url));
  QName opAddEntry = new QName("http://tempuri.org/", "HelloWorld");
  call.setOperationName(opAddEntry);
  call.addParameter("name", XMLType.XSD_STRING, ParameterMode.IN);
  call.setReturnType(XMLType.XSD_STRING);

  Object[] opAddEntryArgs = new Object[] { "jone" };
  String result = (String) call.invoke(opAddEntryArgs);
  call.invoke("http://tempuri.org/", "HelloWorld", opAddEntryArgs);
  System.out.println("result:" + result);
}
}
服務端:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Services.Description;
using System.Web.Services.Protocols;
using System.Diagnostics;
namespace WebApplication1
{
    /// <summary>
    /// WebService1 的摘要說明
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // 若要允許使用 ASP.NET AJAX 從指令碼中呼叫此 Web 服務,請取消註釋以下行。
    // [System.Web.Script.Services.ScriptService]
    [SoapDocumentService(RoutingStyle = SoapServiceRoutingStyle.RequestElement)]
    public class WebService1 : System.Web.Services.WebService
    {
      [SoapRpcMethod(Use = SoapBindingUse.Literal, Action = "http://tempuri.org/HelloWord", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/")]
      [WebMethod]
        public string HelloWorld(string name)
        {
          //Console.WriteLine("name:"+name);
          //Console.ReadKey();
            Debug.WriteLine("NAME:"+name);
          return "hello"+name;
        }
       [SoapRpcMethod(Use = SoapBindingUse.Literal, Action = "http://tempuri.org/add", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/")]
        [WebMethod]
        public int add(int x, int y)
        {
            return x + y;
        }
      
    }
}

呼叫結果:

result:hellojone


1 call.addParameter("name", XMLType.XSD_STRING, ParameterMode.IN);
  call.setReturnType(XMLType.XSD_STRING);

2[SoapRpcMethod(Use = SoapBindingUse.Literal, Action = "http://tempuri.org/HelloWord", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/")]        (c#中每個方法前都要新增這樣的宣告,否則會報錯)

這兩步是必要條件缺一不可,貌似是用以匹配二者的名稱空間

3[SoapDocumentService(RoutingStyle = SoapServiceRoutingStyle.RequestElement)]

本方法加在類之前,旨在防止java呼叫時出現無法識別 soapAction的問題

PS:1 同學用eclipse做客戶端直接用exis2自動生成的stub操作即可呼叫成功

HelloWorld helloWorld = new HelloWorld();
  helloWorld.setName("jone");
  HelloWorldResponse re=stub.HelloWorld(helloWorld);

System.out.println( re.getHelloWorldResult());

但是我跟他C/S程式碼完全相同卻出現這個問題,說明,跟客戶端IDE有關。

        2通過RPCServiceClient以及axis2自動生成的stub呼叫如果可以通過某種API實現兩邊的名稱空間一致,或許也能傳遞成功,這裡我並未深究

        3 按原理通過axis2生成stub呼叫時正確利用了伺服器端的wsdl實現的呼叫功能,但這裡苦於呼叫java編輯的伺服器webservice丟擲wrong number of arguments,呼叫C#webservice出現引數傳遞失敗問題,目前僅能用本帖方法實現,這也可可能跟IDE有關,同學用eclipse就為出現此類情況。。。請大家引以為戒