副标题[/!--empirenews.page--]
现在大部分应用程序都把业务逻辑处理,数据调用等功能封装成了服务的形式,应用程序只需要调用这些web服务就好了,在这里就不赘述web服务的优点了。本文总结如何在android中调用Web服务,通过传递基类型和复杂类型对比调用.NET平台发布的WCF服务和WebService服务之间的区别。
0 写在前面
以前都是在.NET平台上conding,使用.NET平台发布服务,然后再在.NET的客户端进行调用,非常的方便,最简单的方式就是添加web服务引用,通过添加web服务引用实现像本地调用那样调用web服务,当然我们也可以采用http-post、http-get和基于soap协议的方式去调用服务。
最近在弄andriod的程序,需要调用web服务器上的数据,服务采用C#写的,并部署在iis服务器上。我们可以像.NET那样调用服务那,利用andriod库自带的HttpPost和HttpGet类来调用Web服务。但是wcf服务发布的一些没有添加WebGet或者WebInvoke特性的服务,都只提供基于Soap协议的服务调用方式。虽然soap协议也是基于Http协议,也可以使用HttpPost类来进行调用,但拼凑soap结构体是比较麻烦,好在Ksoap2包提供了调用web服务的方法,而且还比较好的兼容了.NET平台发布的服务。因此本文总结在Andriod中如何使用Ksoap2来调用.NET平台的服务,通过传递基类型和复杂类型对比调用.NET服务发布的WCF服务和WebService服务之间的区别。本文的末尾提供Ksoap2包的下载。
1 WCF服务
我们在服务中提供两个方法,一个计算整数加法,另一个接受People对象并且返回People信息(string)。
1.1 People的数据契约
[DataContract]
public class People
{
[DataMember]
public int Age;
[DataMember]
public string Name;
}
2.2 WCF服务契约
[ServiceContract(Name = "JuameService", Namespace = "http://www.juame.edu")]
public interface ITest
{
[OperationContract]
int Add(int op1, int op2);
[OperationContract]
string PostPeopleInfo(People people);
}
上面的服务契约设置了Namespace特性,该特性重要。在后面的wb服务调用中需要用到。
2.3 WCF服务实现
public class TestService : ITest
{
public int Add(int op1, int op2)
{
return op1 + op2;
}
public string PostPeopleInfo(People people)
{
return "姓名:"+people.Name+"/"+"年龄"+people.Age;
}
}
我们需要把服务部署到IIS中去,因此需要添加一个svc文件,把服务实现的代码写在svc文件中,发布后,服务调用的地址就是svc文件的地址。
2.4 服务配置
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<!-- 为避免泄漏元数据信息,请在部署前将以下值设置为 false -->
<serviceMetadata httpGetEnabled="true"/>
<!-- 要接收故障异常详细信息以进行调试,请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息 -->
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service name="Juame.Service.TestService">
<endpoint address=""
binding="basicHttpBinding"
contract ="Juame.Service.ITest">
</endpoint>
</service>
</services>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
<!--
若要在调试过程中浏览 Web 应用程序根目录,请将下面的值设置为 True。
在部署之前将该值设置为 False 可避免泄露 Web 应用程序文件夹信息。
-->
<directoryBrowse enabled="true"/>
</system.webServer>
</configuration>
主要是配置好Service节点和serviceBehaviors就行,服务采用BasicHttpBinding类型。在这里多提一点。BasicHttpBinding是针对于Soap Web Service协议,而webHttpBinding支持web service协议,因此在wcf服务上加上WebGet或WebInvoke特性的必须要使用webHttpBinding类型。
在iis中发布web服务非常简单和部署asp.net网站一样,服务发布成功之后,能访问到svc的地址。

我们提供的服务,一个是传递基类型(string,int,float等),另外一个是传递对象(复杂类型)。
2 Android调用WCF服务
2.1 android布局
界面布局非常简单,两个Button,一个TextView,按钮分别用来调用两个服务,而TextView用来显示服务调用的结果。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.soapprousage.MainActivity" >
<Button android:id="@+id/btn_jlx"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="基类型调用"/>
<Button android:id="@+id/btn_obj"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="对象调用"/>
<TextView android:id="@+id/lbl_result"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textAlignment="viewStart"/>"
</LinearLayout>
2.2 利用Ksoap2调用wcf服务
首先把下载下来的Jar格式的Ksoap包复制到libs(自己创建)文件夹下。
(编辑:应用网_丽江站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|