2015-04-07 107 views
0

我想從android應用程序使用Ksoap libreries調用MS動態Nav(2013 R2)Web服務,但我不斷收到此異常「java.lang.IllegalArgumentException:size < = 0「!我不知道可能是什麼原因!你能幫我嗎?!連接到Ms動態導航網絡服務從android

這是我的代碼:

 import java.io.IOException; 
    import java.net.Authenticator; 
    import java.net.PasswordAuthentication; 
    import java.util.ArrayList; 
    import java.util.List; 

    import org.ksoap2.HeaderProperty; 
    import org.ksoap2.SoapEnvelope; 
    import org.ksoap2.serialization.PropertyInfo; 
    import org.ksoap2.serialization.SoapObject; 
    import org.ksoap2.serialization.SoapPrimitive; 
    import org.ksoap2.serialization.SoapSerializationEnvelope; 
    import org.ksoap2.transport.HttpTransportSE; 
    import org.xmlpull.v1.XmlPullParserException; 

    import android.app.Activity; 
    import android.os.AsyncTask; 
    import android.os.Bundle; 
    import android.view.View; 
    import android.view.View.OnClickListener; 
    import android.widget.Button; 
    import android.widget.TextView; 


    public class Main extends Activity { 
     private final String namespace = "urn:microsoft-dynamics-schemas/codeunit/MonService"; 
     private final String url = "http://[@ip]:7047/DynamicsNAV71/WS/ATLAS%20AUTO/Codeunit/MonService"; 
     private final String soap_action = "urn:microsoft-dynamics-schemas/codeunit/MonService:Hello"; 
     private final String method_name = "Hello"; 
     String great=""; 
     TextView txt; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    txt=(TextView)findViewById(R.id.text); 
    Button bt=(Button)findViewById(R.id.btn); 
    bt.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 

      new Task().execute(); 


     } 
    }) ; 


} 

public String maMethode(){ 
    try 
    { 
      SoapObject request = new SoapObject(namespace, method_name); 


      //Property which holds input parameters 
      PropertyInfo celsiusPI = new PropertyInfo(); 
      //Set Name 
      celsiusPI.setName("par"); 
      int n=123; 
      //Set Value 
      celsiusPI.setValue(n); 
      celsiusPI.setType(int.class); 
      request.addProperty(celsiusPI); 

      SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 


      //envelope.bodyOut=request; 
      envelope.dotNet = true; 
      envelope.setOutputSoapObject(request); 
      HttpTransportSE transport = new HttpTransportSE(url);  
      try{ 

       List<HeaderProperty> headerList = new ArrayList<HeaderProperty>(); 
       headerList.add(new HeaderProperty("Authorization", "Basic " + org.kobjects.base64.Base64.encode("domain\\user:password".getBytes()))); 
       transport.call(soap_action, envelope); 
      }catch(IOException e) 
      { 
       e.printStackTrace(); 
       // System.out.println(e.toString()+"1"); 
       great=e.toString(); 
      } 
      catch(XmlPullParserException e) 
      { 
       e.printStackTrace(); 
       //System.out.println(e.toString()+"2"); 
       great=e.toString(); 
      } 

      if(envelope.bodyIn != null){ 
       SoapPrimitive result = (SoapPrimitive) envelope.getResponse(); 

       great= result.toString(); 
      } 
      return great; 


    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
     // System.out.println(e.toString()+""); 
     great = e.toString(); 
     return great; 

    } 

} 



public class Task extends AsyncTask<Void,Void,Void> 
{ 


    @Override 
    protected Void doInBackground(Void... params) { 
     // TODO Auto-generated method stub 
     great=maMethode(); 
     return null; 
    } 


    @Override 
    protected void onPostExecute(Void result) { 
     //Log.i(TAG, "doInBackground"); 
     txt.setText(great); 
    } 



}} 

這是WSDL:

 <definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="urn:microsoft-dynamics-schemas/codeunit/MonService" targetNamespace="urn:microsoft-dynamics-schemas/codeunit/MonService"> 
    <types> 
    <schema xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="urn:microsoft-dynamics-schemas/codeunit/MonService"> 
    <element name="Hello"> 
    <complexType> 
    <sequence> 
    <element minOccurs="1" maxOccurs="1" name="par" type="int"/> 
    </sequence> 
    </complexType> 
    </element> 
    <element name="Hello_Result"> 
    <complexType> 
    <sequence> 
    <element minOccurs="1" maxOccurs="1" name="return_value" type="string"/> 
    </sequence> 
    </complexType> 
    </element> 
    </schema> 
    </types> 
    <message name="Hello"> 
    <part name="parameters" element="tns:Hello"/> 
    </message> 
    <message name="Hello_Result"> 
    <part name="parameters" element="tns:Hello_Result"/> 
    </message> 
    <portType name="MonService_Port"> 
    <operation name="Hello"> 
    <input name="Hello" message="tns:Hello"/> 
    <output name="Hello_Result" message="tns:Hello_Result"/> 
    </operation> 
    </portType> 
    <binding name="MonService_Binding" type="tns:MonService_Port"> 
    <binding xmlns="http://schemas.xmlsoap.org/wsdl/soap/" transport="http://schemas.xmlsoap.org/soap/http"/> 
    <operation name="Hello"> 
    <operation xmlns="http://schemas.xmlsoap.org/wsdl/soap/" soapAction="urn:microsoft-dynamics-schemas/codeunit/MonService:Hello" style="document"/> 
    <input name="Hello"> 
    <body xmlns="http://schemas.xmlsoap.org/wsdl/soap/" use="literal"/> 
    </input> 
    <output name="Hello_Result"> 
    <body xmlns="http://schemas.xmlsoap.org/wsdl/soap/" use="literal"/> 
    </output> 
    </operation> 
    </binding> 
    <service name="MonService"> 
    <port name="MonService_Port" binding="tns:MonService_Binding"> 
    <address xmlns="http://schemas.xmlsoap.org/wsdl/soap/" location="http://@ip:7047/DynamicsNAV71/WS/ATLAS%20AUTO/Codeunit/MonService"/> 
    </port> 
    </service> 
    </definitions> 

回答

0

我建議使用一個軟件像WCF Storm來測試Web服務端點,並確保你不缺少任何參數(例如Hello)。

否則,我們需要更多關於您從NAV中暴露的內容的詳細信息,例如,頁面,Codeunit,查詢。這將給你的WSDL一些上下文,而不是你好超負荷:)

+0

謝謝:) 我打電話給一個簡單的代碼單元,返回一個文本「你好世界」,我用它只是爲了測試! 驗證碼是否正確? 這是我第一次使用android和Nav! – android

+0

當我在WCF Storm上試用WS時,它告訴我「401 Unauthorized」 是否有NAV實例的任何配置(我已經啓用了SOAP服務)? – android

+0

是的,在全局配置中有一個用於Windows身份驗證的身份驗證選項。 –