Android基于ksoap2调用WCF服务(二):Android篇

摘要:
接下来,让我们介绍一下Android端。Android端基于ksoap2包调用WCF。在AndroidManifest中添加访问网络的权限。xml将ksoap2 android程序集-3.3.0jar与依赖项复制jar文件到android项目的libs文件夹,返回到Eclipse,刷新libs,右键单击项目中的ksoap2包,然后选择BuildPath˃添加到BuildPath。好的。值得注意的是,Android的本机地址不是127.0.0.1,而是10.0.2.2。soapaction是命名空间,方法名称methodName是要调用的方法的名称。结论:1.Android调用WCF,WCF实际上是由调用WCF发布的web服务,即wsdl地址,因此也可以调用其他web服务。

上一篇通过一个非常简单的例子,完成了一个WCF的服务。接下来介绍一下Android端。

Android端调用WCF,采用基于ksoap2包来实现。

下载地址(这个需要fan qiang访问,你们懂的):https://code.google.com/p/ksoap2-android/

我用的3.3.0版本,我传到csdn上,上面地址如果不能访问,可以用这个地址:http://download.csdn.net/detail/cnryc/7695437

程序的源代码下载地址:http://download.csdn.net/detail/cnryc/7694983

1、新建一个Android Project,如图:

Android基于ksoap2调用WCF服务(二):Android篇第1张

很简单,就一个Activity。

在AndroidManifest.xml里面增加访问网络的权限。

<uses-permission android:name="android.permission.INTERNET"/>

把ksoap2-android-assembly-3.3.0-jar-with-dependencies.jar文件复制到安卓项目的libs文件夹下,

回到Eclipse,刷新libs,在项目点击ksoap2包右键,选择Build Path>Add to Build Path ,OK。

Android基于ksoap2调用WCF服务(二):Android篇第2张

2、在activity_main.xml布局文件里增加一个Button:

 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:paddingBottom="@dimen/activity_vertical_margin"
 6     android:paddingLeft="@dimen/activity_horizontal_margin"
 7     android:paddingRight="@dimen/activity_horizontal_margin"
 8     android:paddingTop="@dimen/activity_vertical_margin"
 9     tools:context="com.imoonstal.invokewcf.MainActivity" >
10 
11     <TextView
12         android:id="@+id/tv"
13         android:layout_width="wrap_content"
14         android:layout_height="wrap_content"
15         android:text="@string/hello_world" />
16     <Button
17         android:layout_width="wrap_content"
18         android:layout_height="wrap_content"
19         android:layout_below="@id/tv"
20         android:text="Invoke"
21         android:onClick="btnClick" />
22 
23 </RelativeLayout>

3、在MainActivity.java中增加按钮的btnClick方法和一个实现Runnable接口的内部类。

好像从3.0的sdk开始,Android不允许主线程访问网络了,所以这里启了一个线程来访问wcf服务。

  public void btnClick(View v){
        new Thread(runnable).start();
    }
    
    Runnable runnable = new Runnable(){

        @Override
        public void run() {
            
            CallWebService();
        }
        
    };

之后增加调用WCF服务需要的四个基本信息:

    static String NameSpace = "http://tempuri.org/";
    static String URL="http://10.0.2.2:8733/WCFLibrary/TestService/";
    static String SOAP_ACTION="http://tempuri.org/ITestService/GetString";
    static String MethodName="GetString";

NameSpace是命名空间,在WCF程序里可以指定,如果不指定,默认是http://tempuri.org/

URL就是服务里面的endpoint,在上一篇中的配置文件里有。值得注意的是Android的本机地址不是127.0.0.1而是10.0.2.2

soapaction就是命名空间加上方法的名称

methodName就是需要调用的方法的名称。

这些内容都可以再wsdl那个地址里面找到。点下面那个?wsdl文件会得到wsdl的内容:

Android基于ksoap2调用WCF服务(二):Android篇第3张

点击最上面那个连接之后得到一个wsdl文件,如下:

Android基于ksoap2调用WCF服务(二):Android篇第4张

上面那个四个基本信息在这里都能找到。

之后完成CallWebService()方法:

public void CallWebService(){
        //指定的命名空间和调用的方法名 
        SoapObject request = new SoapObject(NameSpace, MethodName);
        
        //设置需调用接口需要传入的参数
        request.addProperty("value", "imoonstal");
        
        // 生成调用方法的SOAP请求信息,并指定SOAP的版本  
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER10);  
  
        // 下面这两句是一样的作用,写一句就行了
        envelope.bodyOut = request;         
        envelope.setOutputSoapObject(request);
        
        // 设置是否调用的是dotNet开发的WebService  
        envelope.dotNet = true;  
  
        HttpTransportSE transport = new HttpTransportSE(URL);  
        try {  
            // 调用  
            transport.call(SOAP_ACTION, envelope);  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
  
        // 获取返回的数据  
        SoapObject object = (SoapObject) envelope.bodyIn; 
        if(null==object){
            return;
        }
        // 获取返回的结果  
        String result = object.getProperty(0).toString();
        
        System.out.println(result);
    }

运行,显示结果:

Android基于ksoap2调用WCF服务(二):Android篇第5张

得到结果,表示调用成功。

总结:

1、Android调用WCF,实际上是调用的WCF发布出来的WebService,也就是wsdl地址,所以如果调用其他WebService也是可以的。

2、WebService的四个基本信息分别是:命名空间、调用的方法名称、EndPoint和SOAP Action。

  当在浏览器中访问WSDL时,就可以得到命名空间、调用的方法名称,上面已经介绍了。

  URL或者说EndPoint可以从WCF的配置文件中获得,或者将WSDL地址去掉末尾的"?wsdl"。

  而SOAP Action通常为命名空间 + 调用的方法名称。

3、传参数时,一定要按照方法中的参顺序传入“参数名,参数值”。

4、版本号:可以从wsdl地址中得到,xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" 表示版本是12。

  但实际我在调试代码的过程中发现如果把上面的代码

  SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER10);

  中的VER10改成VER12就会报错,错误提示是:http request failed http status 415

  具体原因我也没找到,明天继续找吧,找到了再来补充,有高手的话请把原因告诉我,cnryc@126.com。

  还有WCF的绑定方式要用basicHttpBinding而别用wsHttpBinding,网上有人说也会报415的错误,我没试过。

5、地址和权限:

  android:name=”android.permission.INTERNET” 一定要写到 AndroidManifest.xml 中去,不然调试半天发现这个问题就郁闷了,我之前写程序经常犯这个错,哈哈。

  Android的本机IP地址: 10.0.2.2而不是127.0.0.1或者localhost,这样访问不了本地的。

6、请用多线程异步访问网络,3.0开始Android强制异步访问。即使google没有强制要求,也应该异步操作。

  

 

免责声明:文章转载自《Android基于ksoap2调用WCF服务(二):Android篇》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇CSS样式表定义让文字自动适应Table宽度Oracle 11gR2 RAC 实例 AdminManaged 与 PolicyManaged 区别下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Android:创建文件或文件夹以及获取sd卡根目录

  目录结构: 功能,可以根据录入的目录或者文件夹生成相应的文件或者文件夹 首先需要添加一个权限: <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> MainActivity.java: package com.wyl.xml; imp...

坐标转换,这次是反过来,屏幕坐标转换成世界坐标

今天是做 安卓屏幕滑动交互的时候,发现原来安卓屏幕的坐标是屏幕坐标  坐标为 屏幕左下角0,0  右上角  1920*1080  是以像素为单位的。 那么每个手机都不一样 所以如果以这个坐标来判断是左手滑动屏幕还是右手滑动屏幕会产生问题。 而我这款游戏 摄像机是不动的  摄像机一直对着前方 摄像机的中心就是世界坐标的圆心 , 那么 我把屏幕坐标换成世界坐标...

安卓学习第18课——AdapterViewFlipper

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" androi...

利用WCF实现上传下载文件服务

使用WCF上传文件 在WCF没出现之前,我一直使用用WebService来上传文件,我不知道别人为什么要这么做,因为我们的文件服务器和网站后台和网站前台都不在同一个机器,操作人员觉得用FTP传文件太麻烦,我就做一个专门用来上传文件的WebService,把这个WebService部署在文件服务器上,然后在网站后台调用这个WebService,把网站后台页...

Android广播机制的基本使用

一提到广播我们第一感觉就会联想到小时候村里面的广播,安卓的广播机制也是类似于大喇叭。有发送广播的地方,也有接收广播的地方。但是具体怎么操作呢,我们来一步一步的看下去~ 安卓的广播种类 系统发送的广播:具体有哪些可以看下这篇Bloghttp://blog.sina.com.cn/s/blog_7dbac1250101mt5h.html app发送的广播...

安卓(TableLayout)

1、特点 公共类TableLayout扩展LinearLayout容器不显示其行、列或单元格的边框线。每一行有零个或多个单元格;每个单元格可以包含一个视图对象该表的列数与包含最多单元格的行的列数相同。一个表可以保留空单元格。单元格可以跨列,就像在HTML中一样。 列的宽度由该列中单元格最宽的行定义。但是,TableLayout可以通过调用setColumn...