最近需要做一個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的,坑爹啊````