Android 调用WCF实例
1. 构建服务端程序
1 2 3 4 5 6 7 8 9 10 11 12 13 | using System.ServiceModel; namespace yournamespace { [ServiceContract(Name = "HelloService", Namespace = "http://www.master.haku")] publicinterfaceIHello { [OperationContract] string SayHello(); } } <br> |
1 2 3 4 5 6 7 8 9 10 | namespace YourNameSpace { publicclassYourService { publicstring SayHello(string words) { return"Hello "+ words; } } } |
2. 构建IIS网站宿主
YourService.svc
<%@ServiceHost Debug="true" Service="YourNameSpace.YourService"%>
Web.config
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | <?xml version="1.0"encoding="utf-8"?> <configuration> <system.serviceModel> <serviceHostingEnvironment> <serviceActivations > <add relativeAddress="YourService.svc"service="YourNameSpace.YourService"/> </serviceActivations > </serviceHostingEnvironment > <bindings> <basicHttpBinding> <binding name="BasicHttpBindingCfg"closeTimeout="00:01:00" openTimeout="00:01:00"receiveTimeout="00:10:00"sendTimeout="00:01:00" bypassProxyOnLocal="false"hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288"maxReceivedMessageSize="2147483647" messageEncoding="Text"textEncoding="utf-8"useDefaultWebProxy="true" allowCookies="false"> <readerQuotas maxDepth="32"maxStringContentLength="8192"maxArrayLength="16384" maxBytesPerRead="4096"maxNameTableCharCount="16384"/> <security mode="None"> <transport clientCredentialType="None"proxyCredentialType="None" realm=""/> <message clientCredentialType="UserName"algorithmSuite="Default"/> </security> </binding> </basicHttpBinding> </bindings> <services> <service name="YourNameSpace.YourService"behaviorConfiguration="ServiceBehavior"> <host> <baseAddresses> <add baseAddress="http://localhost:59173/YourService"/> </baseAddresses> </host> <endpoint binding="basicHttpBinding"contract="YourNameSpace.你的服务契约接口"> <identity> <dns value="localhost"/> </identity> </endpoint> </service> </services> <behaviors> <serviceBehaviors> <behavior name="ServiceBehavior"> <serviceMetadata httpGetEnabled="true"/> <serviceDebug includeExceptionDetailInFaults="true"/> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> <system.web> <compilation debug="true"/> </system.web> </configuration> |
3. 寄宿服务
把网站发布到web服务器, 指定网站虚拟目录指向该目录
如果你能够访问http://你的IP:端口/虚拟目录/服务.svc
那么,恭喜你,你的服务端成功了!
4. 使用ksoap2调用WCF
去ksoap2官网
http://code.google.com/p/ksoap2-android/ 下载最新jar
5. 在Eclipse中新建一个Java项目,测试你的服务
新建一个接口, 用于专门读取WCF返回的SoapObject对象
ISoapService
1 2 3 4 5 6 7 8 9 | packagejunit.soap.wcf; importorg.ksoap2.serialization.SoapObject; publicinterfaceISoapService { SoapObject LoadResult(); } <br> |
HelloService
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | packagejunit.soap.wcf; importjava.io.IOException; importorg.ksoap2.SoapEnvelope; importorg.ksoap2.serialization.SoapObject; importorg.ksoap2.serialization.SoapSerializationEnvelope; importorg.ksoap2.transport.HttpTransportSE; importorg.xmlpull.v1.XmlPullParserException; publicclassHelloService implementsISoapService { privatestaticfinalString NameSpace = "http://www.master.haku"; privatestaticfinalString URL = "http://你的服务器/虚拟目录/你的服务.svc"; privatestaticfinalString SOAP_ACTION = "http://www.master.haku/你的服务/SayHello"; privatestaticfinalString MethodName = "SayHello"; privateString words; publicHelloService(String words) { this.words = words; } publicSoapObject LoadResult() { SoapObject soapObject = newSoapObject(NameSpace, MethodName); soapObject.addProperty("words", words); SoapSerializationEnvelope envelope = newSoapSerializationEnvelope(SoapEnvelope.VER11); // 版本 envelope.bodyOut = soapObject; envelope.dotNet = true; envelope.setOutputSoapObject(soapObject); HttpTransportSE trans = newHttpTransportSE(URL); trans.debug = true; // 使用调试功能 try{ trans.call(SOAP_ACTION, envelope); System.out.println("Call Successful!"); } catch(IOException e) { System.out.println("IOException"); e.printStackTrace(); } catch(XmlPullParserException e) { System.out.println("XmlPullParserException"); e.printStackTrace(); } SoapObject result = (SoapObject) envelope.bodyIn; returnresult; } } |
测试程序
1 2 3 4 5 6 7 8 9 10 11 12 | packagejunit.soap.wcf; importorg.ksoap2.serialization.SoapObject; publicclassHelloWcfTest { publicstaticvoidmain(String[] args) { HelloService service = newHelloService("Master HaKu"); SoapObject result = service.LoadResult(); System.out.println("WCF返回的数据是:"+ result.getProperty(0)); } } |
经过测试成功
运行结果:
Hello Master HaKu
6. Android客户端测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | packagedavid.android.wcf; importandroid.app.Activity; importandroid.os.Bundle; importandroid.view.View; importandroid.view.View.OnClickListener; importandroid.widget.Button; importandroid.widget.TextView; importandroid.widget.Toast; importorg.ksoap2.serialization.SoapObject; publicclassAndroidWcfDemoActivity extendsActivity { privateButton mButton1; privateTextView text; /** Called when the activity is first created. */ @Override publicvoidonCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mButton1 = (Button) findViewById(R.id.myButton1); text = (TextView) this.findViewById(R.id.show); mButton1.setOnClickListener(newButton.OnClickListener() { @Override publicvoidonClick(View v) { HelloService service = newHelloService("Master HaKu"); SoapObject result = service.LoadResult(); text.setText("WCF返回的数据是:"+ result.getProperty(0)); } }); } } <br> |
7. 最后运行结果
安卓调用Webservice和Java稍有不同,利用的是ksoap2这个jar包。之前这个jar包是发布在googlecode上面的目前项目已经移动到了github.io,我这里贴上的github官方网站,我也不知道这个github.io和github.com是不是一回事。我们可以在以下页面看到项目的总览:http://simpligility.github.io/ksoap2-android/index.html。
1.下载ksoap2jar包
在如下页面进行下载:https://oss.sonatype.org/content/repositories/ksoap2-android-releases/com/google/code/ksoap2-android/ksoap2-android-assembly/
ksoap2项目的源码在这里,有兴趣的可以弄下来研究哦:
https://github.com/simpligility/ksoap2-android/
2.在Android Studio中进行配置
这一步简单,先放到lib文件夹下,然后再lib上点击右键,选择ADD AS LIB就可以了哦
3.利用网上的服务,自动生成ksoap2可用的webservice的客户端代理类
打开http://www.wsdl2code.com/pages/Home.aspx页面,在页面的右边填入你的webService的访问地址,然后选择生成的方式,我选的是Android Using kSoap2.如果你的webservice还没有发布,也可以直接上传其wsdl文件。
点击submit,此时要求登录,如果没有账号就注册一个,然后登陆,稍等一会这个工具就会为我们自动生成Webservice客户端代理类的代码了,点击下载
当然,自动生成的没有与jar运行环境啊什么的,可能使用的时候有些问题,至少包命名就得改成你自己的,所以,我们再简单的修改一下这些代码就可以直接使用了,省去了我们手动写客户端代理类的麻烦,是不是很方便啊。