- public void ProcessRequest(HttpContext context)
- {
- context.Response.ContentType = "application/json";
- string input = null;
- JavaScriptSerializer jss = new JavaScriptSerializer();
- bool enableGzip = (context.Request.Headers["Content-Encoding"] == "gzip");
- if( enableGzip )
- context.Request.Filter = new GZipStream(context.Request.Filter, CompressionMode.Decompress);
- using( StreamReader sr = new StreamReadercontext.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);
- if( enableGzip ) {
- context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress);
- context.Response.AppendHeader("Content-Encoding", "gzip");
- }
- context.Response.Write(json);
- }
注意:这次我为了不想写二套代码,使用了Request.Filter属性。前面我就说过这是个功能强大的属性。这个属性实现的效果就是装饰器模式,因此您可以继续对输入输出流进行【装饰】,但是要保证输入和输出的装饰顺序要相反。所以使用多次装饰后,会把事情搞复杂,因此,建议需要多次装饰时,做个封装可能会好些。不过,这个属性的更强大之处或许在这里体现的并不明显,要谈它的强大之处已不是本文的主题,我以后再说。
想想:我这几行代码与此服务完全没有关系,而且照这种做法,每个服务都要写一遍,是不是太麻烦了?
- bool enableGzip = (context.Request.Headers["Content-Encoding"] == "gzip");
- if( enableGzip )
- context.Request.Filter = new GZipStream(context.Request.Filter, CompressionMode.Decompress);
- // .............................................................
- if( enableGzip ) {
- context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress);
- context.Response.AppendHeader("Content-Encoding", "gzip");
- }
其实,岂止是这一个地方麻烦。照这种做法,每个服务都要创建一个ahsx文件,读输入,写输出,也是重复劳动。但是,如何改进这些地方,就不是本文的主题了,我将在后面的博客中改进它们。今天的主题是展示这些对象的强大功能。
从以上的示例中,您有没有发现:只要使用这几个对象就可以实现一个服务所必需的基础功能!
在后续博客中,我将引入其它一些ASP.NET的基础对象,并把本次实现的一部分处理抽取出来,实现一个简单的服务框架。有兴趣的同学,可以继