关于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的,坑爹啊````

转载于:https://www.cnblogs.com/yhongyu/archive/2012/08/31/2665178.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值