经过多日努力, 终于勉强弄明白了Android访问WCF服务的方法.

服务端实现

一, 实现服务.

操作契约

[csharp] view plain copy
  1. [ServiceContract]
  2. publicinterfaceIService
  3. {
  4. [OperationContract]
  5. [WebInvoke(
  6. BodyStyle=WebMessageBodyStyle.WrappedRequest,
  7. ResponseFormat=WebMessageFormat.Json,
  8. RequestFormat=WebMessageFormat.Json)]
  9. stringgetMsg();
  10. [OperationContract]
  11. [WebInvoke(
  12. BodyStyle=WebMessageBodyStyle.WrappedRequest,
  13. ResponseFormat=WebMessageFormat.Json,
  14. RequestFormat=WebMessageFormat.Json)]
  15. stringsetMsg(stringmsg);
  16. [OperationContract]
  17. [WebInvoke(
  18. BodyStyle=WebMessageBodyStyle.WrappedRequest,
  19. ResponseFormat=WebMessageFormat.Json,
  20. RequestFormat=WebMessageFormat.Json)]
  21. DatagetData();
  22. [OperationContract]
  23. [WebInvoke(
  24. BodyStyle=WebMessageBodyStyle.WrappedRequest,
  25. ResponseFormat=WebMessageFormat.Json,
  26. RequestFormat=WebMessageFormat.Json)]
  27. DatasetData(Datadata);
  28. }

以上的服务包含了不带参数和带参数访问的形式. 其中Data类的定义如下

[csharp] view plain copy
  1. [DataContract]
  2. publicclassData
  3. {
  4. [DataMember(Name="Name")]
  5. publicstringName{get;set;}
  6. [DataMember(Name="age")]
  7. publicintage{get;set;}
  8. [DataMember(Name="msg")]
  9. publicstringmsg{get;set;}
  10. [DataMember(Name="array")]
  11. publicstring[]array{get;set;}
  12. }

实现服务类

[csharp] view plain copy
  1. usingSystem;
  2. usingSystem.Collections.Generic;
  3. usingSystem.Linq;
  4. usingSystem.Runtime.Serialization;
  5. usingSystem.ServiceModel;
  6. usingSystem.Text;
  7. namespaceHost
  8. {
  9. //注意:使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的类名“Service”。
  10. publicclassService:IService
  11. {
  12. #regionIServiceMembersgetMsg
  13. publicstringgetMsg()
  14. {
  15. Console.WriteLine("getMsgservicehasbeanstatred!");
  16. returnstring.Format("现在服务器时间{0}",DateTime.Now);
  17. }
  18. #endregion
  19. #regionIServiceMemberssetMsg
  20. publicstringsetMsg(stringmsg)
  21. {
  22. Console.WriteLine("setMsgservicehasbeanstarted!");
  23. returnstring.Format("现在服务器时间{0},消息内容{1}",DateTime.Now,msg);
  24. }
  25. #endregion
  26. #regionIServiceMembersgetData
  27. publicDatagetData()
  28. {
  29. Console.WriteLine("getDataservicehasbeanstarted!");
  30. Datadata=newData();
  31. data.Name="MushService";
  32. data.age=20;
  33. data.msg="Thisisadataformservice_HelloData";
  34. data.array=newstring[3]{"string1","string2","string3"};
  35. returndata;
  36. }
  37. #endregion
  38. #regionIServiceMemberssetData
  39. publicDatasetData(Datadata)
  40. {
  41. Console.WriteLine("setDataservicehasbeanstarted!");
  42. data.msg="ThisMSGhasbeanchangedbyservice!!!";
  43. returndata;
  44. }
  45. #endregion
  46. }
  47. }

二, 配置服务

在配置文件的behaviors结点下增加如下内容

[html] view plain copy
  1. <endpointBehaviors>
  2. <behaviorname="json">
  3. <enableWebScript/>
  4. </behavior>
  5. </endpointBehaviors>



修改默认终结点配置

[html] view plain copy
  1. <endpointbinding="webHttpBinding"contract="Host.IService"behaviorConfiguration="json">
  2. <identity>
  3. <dnsvalue="localhost"/>
  4. </identity>
  5. </endpoint>


三, 实现自我寄宿

[csharp] view plain copy
  1. staticvoidMain(string[]args)
  2. {
  3. using(ServiceHosthost=newServiceHost(typeof(Host.Service)))
  4. {
  5. host.Open();
  6. Console.WriteLine("Hostisstarted!!!PressanyENTERtostop.");
  7. Console.ReadLine();
  8. host.Close();
  9. }
  10. }



Android客户端实现

在Android客户端需要按照数据契约规定的数据类型实现一个数据类

[java] view plain copy
  1. publicclassData{
  2. privateStringName;
  3. privateintage;
  4. privateStringmsg;
  5. privateString[]array;
  6. publicStringgetName(){
  7. returnName;
  8. }
  9. publicvoidsetName(Stringname){
  10. Name=name;
  11. }
  12. publicintgetAge(){
  13. returnage;
  14. }
  15. publicvoidsetAge(intage){
  16. this.age=age;
  17. }
  18. publicStringgetMsg(){
  19. returnmsg;
  20. }
  21. publicvoidsetMsg(Stringmsg){
  22. this.msg=msg;
  23. }
  24. publicString[]getArray(){
  25. returnarray;
  26. }
  27. publicvoidsetArray(String[]array){
  28. this.array=array;
  29. }
  30. }


然后结合实际情况编写事物层代码

以下给出一个带参访问web服务的常见用法

[java] view plain copy
  1. /**
  2. *@paramurl服务的完整地址
  3. *@paramdata数据对象
  4. *@paramcontentTypeRequest的ContentType
  5. *@return返回的json字符串
  6. */
  7. publicStringdoPost(Stringurl,Datadata,StringcontentType){
  8. StringstrResp="";
  9. HttpPostrequest=newHttpPost(url);
  10. request.setHeader("Accept","application/json");
  11. request.setHeader("Content-type","application/json");
  12. //组织json
  13. JSONStringervehicle;
  14. try{
  15. vehicle=newJSONStringer().object().key("data").object()
  16. .key("Name").value(data.getName()).key("age").value(data.getAge())
  17. .key("array").value(data.getArray()).key("msg").value(data.getMsg())
  18. .endObject().endObject();
  19. StringEntityentity=newStringEntity(vehicle.toString());
  20. request.setEntity(entity);
  21. //向WCF服务发送请求
  22. DefaultHttpClienthttpClient=newDefaultHttpClient();
  23. HttpResponseresponse=httpClient.execute(request);
  24. //判断是否成功
  25. if(response.getStatusLine().getStatusCode()==HttpURLConnection.HTTP_OK)
  26. strResp=EntityUtils.toString(response.getEntity());
  27. Log.d("WebInvoke","Saving:"
  28. +response.getStatusLine().getStatusCode());
  29. }catch(Exceptione){
  30. //TODOAuto-generatedcatchblock
  31. e.printStackTrace();
  32. }
  33. //Reloadplatenumbers
  34. returnstrResp;
  35. }

判断访问web服务是否成功通过

[java] view plain copy
  1. response.getStatusLine().getStatusCode()==HttpURLConnection.HTTP_OK

即可

源码下载:

WCF服务端.

Android客户端.

http://blog.csdn.net/btyh17mxy/article/details/7993111

更多相关文章

  1. 基于Apache mina 的android 客户端tcp长连接实现
  2. Android基于基于布局嵌套的页面导航实现
  3. 浅析android通过jni控制service服务程序的简易流程
  4. struts2中获取request、response,与android客户端进行交互
  5. Android网络通信(2):HTTP通信
  6. 《Android和PHP最佳实践》官方站
  7. 基于MQTT实现Android消息推送(Push)
  8. 浅谈Java中Collections.sort对List排序的两种方法
  9. python list.sort()根据多个关键字排序的方法实现

随机推荐

  1. Android获取设备型号和系统版本号、mac地
  2. 鸿洋大神博文Android(安卓)自定义View (
  3. 4.AutoCompleteTextView
  4. 【百度地图-安卓SDK】技术详解集锦
  5. Android(安卓)MediaCodec 解码H264码流播
  6. android基础
  7. 安卓的下拉控件Spinner
  8. Android系统自带的常用数据库
  9. [转]android:利用DatabaseUtils.InsertHel
  10. Android NDK开发初步