本人是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!";
}
}
}
如我的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;
}
}
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);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView1=(TextView)findViewById(R.id.textView1);
new Thread(myRunnable).start();
}
@Override
public 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文件添加权限