zoukankan      html  css  js  c++  java
  • wcf完美搭建android平台服务之一

      由于android系统的特殊性,对于wcf的平台服务的搭建就带来特殊要求,在这两种平台应用上数据的通用性而讲,能实现其信息的传递,我们可以采用JSON/XML两种数据数据格式传递,在wcf服务的搭建的时候我们就需要将数据序列化成这两种类型。

        在查阅MSDN中我们找到了,这两种数据格式的数据契约进行了定义,详细参照:具有 JSON 和 XML 的 AJAX 服务示例

    我们使用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数据格式的时候,我们必须显示的将 ResponseFormat(或 ResponseFormat)属性设置为 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
    {
    //// <summary>
    /// Suident实体类
    ///</summary>
    [DataContract]
    public class Sutdent
    {
    //// <summary>
    /// 用户名
    ///</summary>
    [DataMember(Order = 0)]
    public string Name { get; set; }
    ///<summary>
    /// 生日
    ///</summary>
    [DataMember(Order = 1)]
    public DateTime DayOfbirth { get; set; }

    }
    }
    第二步、新建json的服务契约,注释很详细
    using System;
    using System.ServiceModel;
    using System.ServiceModel.Web;

    namespace AndroidHost
    {
    ///<summary>
    /// 演示IStudentJson的接口
    ///</summary>
    ///<remarks>
    /// HTTP方法中:
    /// PUT相当于Create
    /// GET相当于Read
    /// POST相当于Update
    /// DELETE相当于Delete
    /// 即(Method方式定义了http里面方法的名称)
    ///</remarks>
    [ServiceContract]
    public interface IStudentJson
    {
    ///<summary>
    /// 创建学生
    ///</summary>
    ///<param name="name">用户名</param>
    ///<param name="dayOfbirth">生日</param>
    ///<remarks>
    /// WebInvoke - 指示服务操作在逻辑上就是调用操作,而且可由 Web 编程模型调用
    /// UriTemplate - 用于服务操作的统一资源标识符 (URI) 模板。URI模板可以将一个 URI 或一组 URI 映射到服务操作。有关 URI 模板的更多信息,请参见 UriTemplate 和 UriTemplateTable
    /// Method - 与操作关联的协议方法,默认为 POST
    /// ResponseFormat - 指定从服务操作发出的响应的格式。Xml 或 Json
    /// BodyStyle-指定body里面的封装
    ///</remarks>
    [OperationContract]
    [WebInvoke(
    UriTemplate = "User/{name}/{dayOfbirth}",
    Method = "PUT",
    ResponseFormat = WebMessageFormat.Json,
    BodyStyle = WebMessageBodyStyle.Bare
    )]
    Sutdent CreateUser(string name, string dayOfbirth);

    ///<summary>
    /// 获取用户信息
    ///</summary>
    ///<param name="name">用户名</param>
    ///<remarks>
    /// WebGet - 指示服务操作在逻辑上就是检索操作,而且可由 Web 编程模型调用
    ///</remarks>
    [OperationContract]
    [WebGet(
    UriTemplate = "User/{name}",
    ResponseFormat = WebMessageFormat.Json)]
    Sutdent GetUser(string name);


    ///<summary>
    /// 更新用户信息
    ///</summary>
    ///<param name="name">用户名</param>
    ///<param name="dayOfbirth">生日</param>
    ///<returns></returns>
    [OperationContract]
    [WebInvoke(UriTemplate = "User/{name}/{dayOfbirth}",
    Method = "POST",
    ResponseFormat = WebMessageFormat.Json)]
    bool UpdateUser(string name, string dayOfbirth);
    ///<summary>
    /// 删除用户信息
    ///</summary>
    ///<param name="name">用户名</param>
    ///<returns></returns>
    [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
    {
    ///<summary>
    /// 演示IStudentXML的接口
    ///</summary>
    ///<remarks>
    /// HTTP方法中:
    /// PUT相当于Create
    /// GET相当于Read
    /// POST相当于Update
    /// DELETE相当于Delete
    /// 即(Method方式定义了http里面方法的名称)
    ///</remarks>
    [ServiceContract]
    public interface IStudentXml
    {
    ///<summary>
    /// 创建学生
    ///</summary>
    ///<param name="name">用户名</param>
    ///<param name="dayOfbirth">生日</param>
    ///<remarks>
    /// WebInvoke - 指示服务操作在逻辑上就是调用操作,而且可由 Web 编程模型调用
    /// UriTemplate - 用于服务操作的统一资源标识符 (URI) 模板。URI模板可以将一个 URI 或一组 URI 映射到服务操作。有关 URI 模板的更多信息,请参见 UriTemplate 和 UriTemplateTable
    /// Method - 与操作关联的协议方法,默认为 POST
    /// ResponseFormat - 指定从服务操作发出的响应的格式。Xml 或 Json
    ///</remarks>
    [OperationContract]
    [WebInvoke(
    UriTemplate = "User/{name}/{dayOfbirth}",
    Method = "PUT",
    ResponseFormat = WebMessageFormat.Xml)]
    Sutdent CreateUser(string name, string dayOfbirth);

    /**/
    ///<summary>
    /// 获取用户信息
    ///</summary>
    ///<param name="name">用户名</param>
    ///<remarks>
    /// WebGet - 指示服务操作在逻辑上就是检索操作,而且可由 Web 编程模型调用
    ///</remarks>
    [OperationContract]
    [WebGet(
    UriTemplate = "User/{name}",
    ResponseFormat = WebMessageFormat.Xml)]
    Sutdent GetUser(string name);

    /**/
    ///<summary>
    /// 更新用户信息
    ///</summary>
    ///<param name="name">用户名</param>
    ///<param name="dayOfbirth">生日</param>
    ///<returns></returns>
    [OperationContract]
    [WebInvoke(UriTemplate = "User/{name}/{dayOfbirth}",
    Method = "POST",
    ResponseFormat = WebMessageFormat.Xml)]
    bool UpdateUser(string name, string dayOfbirth);

    /**/
    ///<summary>
    /// 删除用户信息
    ///</summary>
    ///<param name="name">用户名</param>
    ///<returns></returns>
    [OperationContract]
    [WebInvoke(
    UriTemplate = "User/{name}",
    Method = "DELETE",
    ResponseFormat = WebMessageFormat.Xml)]
    bool DeleteUser(string name);

    }
    }
    第四步、添加服务实现,即student的操作,记住这里同时实现上面的IStudentJson和IStudentXml接口
    using System;
    namespace AndroidHost
    {
    ///<summary>
    /// 实现两种数据结果的方法
    ///</summary>
    public class StudentManger : IStudentJson, IStudentXml
    {
    ///<summary>
    /// 创建学生
    ///</summary>
    public Sutdent CreateUser(string name, string dayOfbirth)
    {
    return new Sutdent
    {
    Name = "张三",
    DayOfbirth = System.DateTime.Now
    };
    }
    ///<summary>
    /// 获取学生
    ///</summary>
    public Sutdent GetUser(string name)
    {
    return new Sutdent
    {
    Name = name,
    DayOfbirth = new DateTime(1980, 2, 14)
    };
    }

    ///<summary>
    ///更新学生
    ///</summary>
    public bool UpdateUser(string name, string dayOfbirth)
    {
    return true;
    }
    ///<summary>
    /// 删除学生
    ///</summary>
    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客户端应用..后面篇幅中介绍。
     
  • 相关阅读:
    SpringMVC+Shiro权限管理(转载)
    面试常见问题(转载)
    JavaScript 五种(非构造方式)继承
    JavaScript 五种(构造方式)继承
    Quartz.Net 基于XML配置启动
    jexus防止产生 *.core文件
    Last-Modified、ETag、Expires和Cache-Control
    正则表达式记录
    C# 操作mongodb子文档
    ASP.NET Core "完整发布,自带运行时" 到jexus
  • 原文地址:https://www.cnblogs.com/afly/p/2398176.html
Copyright © 2011-2022 走看看