KSOAP2—WCF

Android想要调用WebService,两种方式,其一HttpGet,HttpPost,Restful协议,其二是通过开源的第三方组件KSOAP2.几天的尝试过程中遇到了种种挫折,但最后也终于调通了,给有兴趣的朋友分享下,以免多走弯路.

1. 使用VS2012新建WCF,默认是基于.NET4.5,实践证明各个版本的KSOAP2(包括最新的3.0.0-RC.4),都无法成功,会报各种错误.

    解决方法是: 新建WCF时选择.NET3.5,调试的时候选择IIS,而非IIS Express.建立对应的虚拟目录.

安装过.NET4.5的电脑,*.svc文件会被.Net Framework4.0的处理程序aspnet_isapi.dll接管,把原先的3.5给废了,重新注册.Net 3.5的WCF.详情 http://www.cnblogs.com/ApolloSun/archive/2010/03/05/1679236.html

2.KSOAP2的标准使用方法,包括URL,SOAPAction的格式.此处以调用WCF默认生成的GetData为准.尝试过KSOAP2的2.5.4,2.6.5,3.0.0-RC4,目前用到的接口差异不大,都可以正常使用.具体的调用方法及注意事项如下:

    // 命名空间
    private static final String serviceNameSpace = “http://tempuri.org/“; //注意org后面有个”/”,少了就等着报错…
    // 方法名称
    private static final String methodName = “GetData”;
    // 请求URL
    private static final String serviceURL = “http://10.130.8.54/WcfService4/Service1.svc“; //IP地址,用计算机名称会出错,无法识别,可能与手机无法识别域网中机器地址有关,
    // SoapAction
    private static final String soapAction = “http://tempuri.org/IService1/GetData“; //这个地址不WcfService4的虚拟地址,可以在wsdl中找到此地址.在wsdl中记录. wsdl:input wsaw:Action=”http://tempuri.org/IService1/GetData

     ……

    /**
     *  调用WCF并返回字符串形式的值
     * @return
     * @throws IOException
     * @throws XmlPullParserException
     */
    private String getRequestData() {
        // 实例化SoapObject对象,指定webService的命名空间以及调用方法的名称
        SoapObject request = new SoapObject(serviceNameSpace, methodName);
        // example方法中有一个String的参数,这里将“android client”传递到example中
        request.addProperty(“value”, 888);  //此处value必现WCF端的形参名称匹配,否则参数无法传递!
        // 获得序列化的Envelope
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                SoapEnvelope.VER11); //VER10,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();
        } catch (Exception e)  {  //还有其它错误,除了IOException,XmlPullParserException
                System.out.println(“Other error”);
        }         
        try {
            if (envelope.getResponse() != null) {
                return envelope.bodyIn.toString();
            }
        } catch (SoapFault e) {
            // TODO Auto-generated catch block
            return e.getMessage();
        }
        return null;
    }

3.在Eclipse中通过真机调用,仍然无法调用成功,未找到办法,如何传递复杂的数据类型如对象,下一步会深入研究.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.