由于android系统的特殊性,对于wcf的平台服务的搭建就带来特殊要求,在这两种平台应用上数据的通用性而讲,能实现其信息的传递,我们可以采用JSON/XML两种数据数据格式传递,在wcf服务的搭建的时候我们就需要将数据序列化成这两种类型。
在查阅MSDN中我们找到了,这两种数据格式的数据契约进行了定义,详细参照:
我们使用webHttpEndpoint配置终结点,在WebHttpEndPoint的默认数据格式为xml,而WebScripEndpoint的默认格式为JSON,一般在定义数据格式的时候我们采用WebGetAttribute或者WebInvokedAttribute属性(后者可以指定客户端访问模式get/post),这样样式特定于webhttp行为,对其JSON/Xml数据格式进行设置
[OperationContract] [WebInvoke(ResponseFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Wrapped)] MathResult DoMathXml(double n1, double n2);
另一个操作使用 WebInvokeAttribute 属性并显式指定响应的 JSON(而不是 XML)。
OperationContract] [WebInvoke(ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)] MathResult DoMathJson(double n1, double n2);
请注意,在这两种情况下,操作均返回一个复杂类型 MathResult,该类型是一个标准的 WCF 数据协定类型。
其实这两种数据格式的创建使用用于ajax客户端或者jquery使用,因为其数据格式被序列成JSON或者XML,这两者同样的适合于android平台使用,所以
我们应用这两种数据格式为android平台提供服务,这里有几个点需要注意:
1、当客户端我们需应用JSON数据格式的时候,我们必须显示的将 (或 )属性设置为 。
2、当开启客户端数据回传方式的时候我们如果需要指定,我们需要WebInvoke设置其方式: [WebInvoke(Method = "GET"]
下面通过一个案例综合来实现我们测操作:
第一步,新建数据实体,记住添加引用(using System.Runtime.Serialization)和(using System.ServiceModel)
using System; using System.Runtime.Remoting; using System.Runtime.Serialization; //实现数据序列化 namespace AndroidHost { /////// Suident实体类 /// [DataContract] public class Sutdent { /////// 用户名 /// [DataMember(Order = 0)] public string Name { get; set; } ////// 生日 /// [DataMember(Order = 1)] public DateTime DayOfbirth { get; set; } } }
第二步、新建json的服务契约,注释很详细
using System; using System.ServiceModel; using System.ServiceModel.Web; namespace AndroidHost { ////// 演示IStudentJson的接口 /// ////// HTTP方法中: /// PUT相当于Create /// GET相当于Read /// POST相当于Update /// DELETE相当于Delete /// 即(Method方式定义了http里面方法的名称) /// [ServiceContract] public interface IStudentJson { ////// 创建学生 /// ///用户名 ///生日 ////// WebInvoke - 指示服务操作在逻辑上就是调用操作,而且可由 Web 编程模型调用 /// UriTemplate - 用于服务操作的统一资源标识符 (URI) 模板。URI模板可以将一个 URI 或一组 URI 映射到服务操作。有关 URI 模板的更多信息,请参见 UriTemplate 和 UriTemplateTable /// Method - 与操作关联的协议方法,默认为 POST /// ResponseFormat - 指定从服务操作发出的响应的格式。Xml 或 Json /// BodyStyle-指定body里面的封装 /// [OperationContract] [WebInvoke( UriTemplate = "User/{name}/{dayOfbirth}", Method = "PUT", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare )] Sutdent CreateUser(string name, string dayOfbirth); ////// 获取用户信息 /// ///用户名 ////// WebGet - 指示服务操作在逻辑上就是检索操作,而且可由 Web 编程模型调用 /// [OperationContract] [WebGet( UriTemplate = "User/{name}", ResponseFormat = WebMessageFormat.Json)] Sutdent GetUser(string name); ////// 更新用户信息 /// ///用户名 ///生日 ///[OperationContract] [WebInvoke(UriTemplate = "User/{name}/{dayOfbirth}", Method = "POST", ResponseFormat = WebMessageFormat.Json)] bool UpdateUser(string name, string dayOfbirth); /// /// 删除用户信息 /// ///用户名 ///[OperationContract] [WebInvoke( UriTemplate = "User/{name}", Method = "DELETE", ResponseFormat = WebMessageFormat.Json)] bool DeleteUser(string name); } }
第三步、新建xml服务契约,实现服务的XML序列化传输
using System; using System.ServiceModel; using System.ServiceModel.Web; namespace AndroidHost { ////// 演示IStudentXML的接口 /// ////// HTTP方法中: /// PUT相当于Create /// GET相当于Read /// POST相当于Update /// DELETE相当于Delete /// 即(Method方式定义了http里面方法的名称) /// [ServiceContract] public interface IStudentXml { ////// 创建学生 /// ///用户名 ///生日 ////// WebInvoke - 指示服务操作在逻辑上就是调用操作,而且可由 Web 编程模型调用 /// UriTemplate - 用于服务操作的统一资源标识符 (URI) 模板。URI模板可以将一个 URI 或一组 URI 映射到服务操作。有关 URI 模板的更多信息,请参见 UriTemplate 和 UriTemplateTable /// Method - 与操作关联的协议方法,默认为 POST /// ResponseFormat - 指定从服务操作发出的响应的格式。Xml 或 Json /// [OperationContract] [WebInvoke( UriTemplate = "User/{name}/{dayOfbirth}", Method = "PUT", ResponseFormat = WebMessageFormat.Xml)] Sutdent CreateUser(string name, string dayOfbirth); /**/ ////// 获取用户信息 /// ///用户名 ////// WebGet - 指示服务操作在逻辑上就是检索操作,而且可由 Web 编程模型调用 /// [OperationContract] [WebGet( UriTemplate = "User/{name}", ResponseFormat = WebMessageFormat.Xml)] Sutdent GetUser(string name); /**/ ////// 更新用户信息 /// ///用户名 ///生日 ///[OperationContract] [WebInvoke(UriTemplate = "User/{name}/{dayOfbirth}", Method = "POST", ResponseFormat = WebMessageFormat.Xml)] bool UpdateUser(string name, string dayOfbirth); /**/ /// /// 删除用户信息 /// ///用户名 ///[OperationContract] [WebInvoke( UriTemplate = "User/{name}", Method = "DELETE", ResponseFormat = WebMessageFormat.Xml)] bool DeleteUser(string name); } }
第四步、添加服务实现,即student的操作,记住这里同时实现上面的IStudentJson和IStudentXml接口
using System; namespace AndroidHost { ////// 实现两种数据结果的方法 /// public class StudentManger : IStudentJson, IStudentXml { ////// 创建学生 /// public Sutdent CreateUser(string name, string dayOfbirth) { return new Sutdent { Name = "张三", DayOfbirth = System.DateTime.Now }; } ////// 获取学生 /// public Sutdent GetUser(string name) { return new Sutdent { Name = name, DayOfbirth = new DateTime(1980, 2, 14) }; } //////更新学生 /// public bool UpdateUser(string name, string dayOfbirth) { return true; } ////// 删除学生 /// public bool DeleteUser(string name) { return true; } } }
第五步、采取自托管的方式发布服务
using System; using System.ServiceModel; namespace AndroidHost { class Program { static void Main(string[] args) { using (ServiceHost host = new ServiceHost(typeof(StudentManger))) { host.Opened += delegate { Console.WriteLine("服务已经启动,公开服务地址有:"); }; host.Open(); foreach (var endpoint in host.Description.Endpoints) { Console.WriteLine(endpoint.Address.ToString()); } Console.WriteLine("按下任何键的时候停止服务..."); Console.ReadKey(); host.Close(); } } } }
至此整个服务我们已经配置完成,运行看结果:
嘿嘿,成功,两种终结点服务已经同时提供,下一片我们实现android客户端的应用操作。。。当然作为json和xml作为webhttp编程模型的传输协议,其具
有的通用性,我们也可以实现ajax或者jquery客户端应用..后面篇幅中介绍。