1. 首页
  2. Android

Android客户端如何使用ksoap2调用wcf(.svc)

之前做一个android的项目需要调用.net的wcf,第一次做,花了好久,现在总结一下途中的许多问题,供大家参考,避免遇到同样的问题。

1.首先是遇到的问题是android虚拟机无法上网。

这个问题我弄了一天,不管怎么调就是不上网,一直瞎调试···后来打开浏览器发现网页也打不开,查了一下发现dns配置和自己的电脑的不一样的原因。

 在cmd-adb shell-setprop net.dns1 自己电脑的dns(详见 android模拟机不能上网)。

当然,这个不能忘了哈

<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的,坑爹啊““

评分 0, 满分 5 星
0
0
看完收藏一下,下次也能找得到
  • 版权声明:本文基于《知识共享署名-相同方式共享 3.0 中国大陆许可协议》发布,转载请遵循本协议
  • 文章链接:http://www.yhy0.com/android_20151019_25.html [复制] (转载时请注明本文出处及文章链接)
上一篇:
:下一篇