您的位置:首页 > 移动开发 > Android开发

关于android客户端使用ksoap2调用wcf(.svc)的总结

2012-08-31 12:24 489 查看
最近需要做一个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的,坑爹啊````
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: