- public class QueryOrderService : IHttpHandler
- {
- public void ProcessRequest(HttpContext context)
- {
- context.Response.ContentType = "application/json";
- string input = null;
- JavaScriptSerializer jss = new JavaScriptSerializer();
- using( StreamReader sr = new StreamReader(context.Request.InputStream) ) {
- input = sr.ReadToEnd();
- }
- QueryOrderCondition query = jss.Deserialize<QueryOrderCondition>(input);
- // 模拟查询过程,这里就直接返回一个列表。
- List<Order>list = new List<Order>();
- for( int i = 0;i <10;i++ )
- list.Add(DataFactory.CreateRandomOrder());
- string json = jss.Serialize(list);
- context.Response.Write(json);
- }
代码很简单,经过了以下几个步骤:
1. 从Request.InputStream中读取客户端发送过来的JSON字符串,
2. 反序列化成需要的输入参数,
3. 执行查询订单的操作,生成结果数据,
4. 将结果做JSON序列化,转成字符串,
5. 写入到响应流。
很简单吧,我可以把它看作是一个服务吧,但它没有其它服务框架的种种约束,而且相当灵活,比如我可以让服务采用GZIP的方式来压缩传输数据:
- public void ProcessRequest(HttpContext context)
- {
- context.Response.ContentType = "application/json";
- string input = null;
- JavaScriptSerializer jss = new JavaScriptSerializer();
- using( GZipStream gzip = new GZipStream(context.Request.InputStream, CompressionMode.Decompress) ) {
- using( StreamReader sr = new StreamReader(gzip) ) {
- input = sr.ReadToEnd();
- }
- }
- QueryOrderCondition query = jss.Deserialize<QueryOrderCondition>(input);
- // 模拟查询过程,这里就直接返回一个列表。
- List<Order>list = new List<Order>();
- for( int i = 0;i <10;i++ )
- list.Add(DataFactory.CreateRandomOrder());
- string json = jss.Serialize(list);
- using( GZipStream gzip = new GZipStream(context.Response.OutputStream, CompressionMode.Compress) ) {
- using( StreamWriter sw = new StreamWriter(gzip) ) {
- context.Response.AppendHeader("Content-Encoding", "gzip");
- sw.Write(json);
- }
- }
- }
修改也很直观,在输入输出的地方,加上Gzip的操作就可以了。
如果您想加密传输内容,也可以在读写之间做相应的处理,或者,想换个序列化方式,也简单,我想您应该懂的。
总之,如何读写数据,全由您来决定。喜欢怎样处理就怎样处理,这就是自由。
不仅如此,我还可以让服务端判断客户端是否要求使用GZIP方式来传输数据,如