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客户端应用..后面篇幅中介绍。
 
posted @ 2011-11-29 16:24  指尖流淌  阅读(6240)  评论(7编辑  收藏  举报