Android调用WCF
本人是C#程序猿,但是随着Android的不断流行也慢慢的开始学习Android。在不断的学习中想把Android自带数据Sqlite中的数据同步到Sql中,于是就想到Android调用WCF同步数据。
1)首先创建WCF
新建ASP.NET Web空Web应用程序,在应用程序中添加WCF服务“Service1.svc”。
添加WCF服务“Service1.svc”后我们可以看到应用程序中多了接口文件“IService1.cs”和服务文件“Service1.svc”。
修改接口文件“IService1.cs”代码如下
using System;using System.Collections.Generic;using System.Linq;using System.Runtime.Serialization;using System.ServiceModel;using System.Text;namespace WCFDemo{ // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IService1”。 [ServiceContract(Namespace = "http://chad.cao")]//在Android调用WCF时需要Namespace public interface IService1 { [OperationContract] void DoWork(); [OperationContract] string HelloWorld(string _name); }}
修改服务文件“Service1.svc”代码如下 using System;using System.Collections.Generic;using System.Linq;using System.Runtime.Serialization;using System.ServiceModel;using System.Text;namespace WCFDemo{ // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码、svc 和配置文件中的类名“Service1”。 public class Service1 : IService1 { public void DoWork() { } public string HelloWorld(string _name) { return _name + " hello world!"; } }}
2)将WCF发布到IIS
如我的WCF发布URL是http://192.168.2.102/AndroidUseWCF/Service1.svc
3)Android调用WCF
Android调用WCF是我在这里用的是ksoap2,ksoap2下载路径如下:http://download.csdn.net/detail/czh4869623/6601997
有了ksoap2后如何调用,这个问题对Android高手是多余的,但是很多新手应该还是需要讲解一下的
首先我们讲ksoap2粘贴到项目的“libs”目录下,然后点击Eclipse的"Project"下的“Properties”选项卡,接下来选择左边的“Java Build Path”后在右边选择“Libraries”选项卡,单机“Add JARs...”按钮通过浏览到当前项目下的"libs"目录将ksoap2添加。
接下来我们打开Eclipse新建Android Application Project,然后创建接口“ISoapService”和实现接口类“SoapService”
接口“ISoapService”代码如下
package com.example.androidusewcf;import org.ksoap2.serialization.SoapObject;public interface ISoapService {SoapObject HelloWorldResult();}
实现接口类“SoapService”代码如下,主要是实现调用WCF
package com.example.androidusewcf;import org.ksoap2.SoapEnvelope;import org.ksoap2.serialization.SoapObject;import org.ksoap2.serialization.SoapSerializationEnvelope;import org.ksoap2.transport.HttpTransportSE;public class SoapService implements ISoapService{/*和WCF ServiceContract中的Namespace一致*/private static final String NAMESPACE="http://chad.cao";/*方法名*/private static final String METHODNAME="HelloWorld";/*WCF在iis中的调用路径(http://服务器/虚拟目录/服务)*/private static final String URL="http://192.168.2.102/AndroidUseWCF/Service1.svc";/*Namespace/服务接口/方法*/private static final String SOAPACTION="http://chad.cao/IService1/HelloWorld";private String name;public SoapService(String _name){this.name=_name;}public SoapObject HelloWorldResult(){SoapObject result=null;SoapObject soapObject=new SoapObject(NAMESPACE, METHODNAME);soapObject.addProperty("_name", name);//传参,记住参数名必须和WCF方法中的参数名一致SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER11);envelope.bodyOut=soapObject;envelope.dotNet=true;envelope.setOutputSoapObject(soapObject);HttpTransportSE transportSE=new HttpTransportSE(URL);transportSE.debug=true;//使用调式功能try {transportSE.call(SOAPACTION, envelope);result=(SoapObject) envelope.bodyIn;} catch (Exception e) {String exceptionString=e.toString();}return result;}}
然后在MainActivity.java中调用类,重点提醒:MainActivity中调用类“SoapService”实现调用WCF时必须在子线程中实现,不然将会报主线程异常,MainActivity.java具体代码如下
package com.example.androidusewcf;import org.ksoap2.serialization.SoapObject;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.app.Activity;import android.view.Menu;import android.widget.TextView;public class MainActivity extends Activity {private TextView textView1=null; /* 在MainActivity中定义Handler对象作为成员变量 * 通过Handler这个对象对主线程中的控件进行更新 * */ private Handler handler=new Handler(){ public void handleMessage(Message msg){ switch (msg.what) { case 0: /*取出参数更新控件*/ textView1.setText(msg.getData().getString("_result")); break; default: break; } super.handleMessage(msg); } }; private Runnable myRunnable=new Runnable() { @Override public void run() { /*传参*/ Message msg=new Message(); msg.what=0; SoapService soapService=new SoapService("chad.cao"); SoapObject soapObject=soapService.HelloWorldResult(); String result=soapObject==null?"网络连接失败!":soapObject.getProperty(0).toString(); Bundle bundle=new Bundle(); bundle.putString("_result", result); msg.setData(bundle); /*发送信息到Handler*/ handler.sendMessage(msg); } }; @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);textView1=(TextView)findViewById(R.id.textView1);new Thread(myRunnable).start();}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}}
最后记得修改AndroidManifest.xml文件添加权限
更多相关文章
- android中读写sd卡文件
- Android 支持的文件类型
- Android下载文本文件和mp3文件
- android project 文件夹
- Android 多国语言文件夹
- android shape用法(xml文件)
- android文件关联之mime type
- ubuntu共享文件夹设置
- android文件读取