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);  
        }  
    }; 
	@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文件添加权限

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



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值