關於android客戶端使用ksoap2調用wcf(.svc)的總結


最近需要做一個android的項目調用.net的wcf,第一次做,花了好久,現在總結一下途中的許多問題,供大家參考,避免遇到同樣的問題。

1.首先是遇到的問題是android虛擬機無法上網。

這個問題我弄了一天,不管怎么調就是不上網,一直瞎調試···后來打開瀏覽器發現網頁也打不開,查了一下發現dns配置和自己的電腦的不一樣的原因。

 在cmd-adb shell-setprop net.dns1 自己電腦的dns(詳見上一篇轉載)。

當然,這個不能忘了哈

<uses-permission android:name="android.permission.INTERNET" />

2.實際連接的代碼不多說了,網上有的是,我直接上代碼了,這里面就是.svc和.asmx的區別了,注釋的是.asmx的soaaction是命名空間+方法名,.svc的soapaction是命名空間+契約名(這個我不是很懂,不知道叫法有沒有問題,歡迎指出錯誤)+方法名。其實很早就實現了連接.asmx后綴的,但是就是實現不了連接.svc的

package com.example.wstest1;

import java.io.IOException;

import org.ksoap2.SoapEnvelope;
import org.ksoap2.SoapFault;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import org.xmlpull.v1.XmlPullParserException;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class MainActivity extends Activity {

    private final static String TAG = "MainActivity";
    // 命名空間
    private static final String serviceNameSpace = "http://tempuri.org/";
    // 方法名稱
    private static final String methodName = "ReceviceCommand";
    // 請求URL
    private static final String serviceURL = "http://10.14.4.67:3009/ITHmeApp/ITHomeService.svc";
    //private static final String serviceURL = "http://10.14.4.67:3009/ITHmeApp/ITHomeService.asmx";
    // SoapAction
    private static final String soapAction = "http://tempuri.org/IITHome/ReceviceCommand";
    //private static final String soapAction = "http://tempuri.org/ReceviceCommand";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView t = (TextView) findViewById(R.id.test1);
        String re = getRequestData();
        t.setText(re);
        Log.e(TAG, re);
    }

    /**
     * 
     * @return
     * @throws IOException
     * @throws XmlPullParserException
     */
    private String getRequestData() {
        // 實例化SoapObject對象,指定webService的命名空間以及調用方法的名稱
        SoapObject request = new SoapObject(serviceNameSpace, methodName);
        // example方法中有一個String的參數,這里將“android client”傳遞到example中
        request.addProperty("inputCommand", "oh");
        // 獲得序列化的Envelope
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                SoapEnvelope.VER11);
        envelope.dotNet = true;
        envelope.bodyOut = request;

        // Android傳輸對象
        HttpTransportSE transport = new HttpTransportSE(serviceURL);
        transport.debug = true;

        // 調用WebService
        try {
            transport.call(soapAction, envelope);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            return e.getMessage();
        } catch (XmlPullParserException e) {
            // TODO Auto-generated catch block
            return e.getMessage();
        }

        try {
            if (envelope.getResponse() != null) {
                return envelope.bodyIn.toString();
            }
        } catch (SoapFault e) {
            // TODO Auto-generated catch block
            return e.getMessage();
        }

        return null;
    }
}

3,這是核心問題了,糾結了好幾天的問題,報錯unterminated entity ref (position:TEXT

這個問題在連接.asmx完全不存在,但是連接.svc就是怎么也找不到,然后找了一下國外的論壇終於發現,原來,是ksoap2版本的問題,我用的是最新的2.6.5,但是不知是2.6.5一個bug還是其他什么原因,需要換成2.5.7的,坑爹啊````


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM