Silverlight_Rest_WCF系列之四:Rest调用者,RestInvoker.

简介:

还记得上篇文章中的PUT调用Rest服务的代码吗?不记得没关系,下面就是它的代码。

View Code

如果说每次调用服务都需要写这么多代码的话,那估计程序员会疯的。所以我决定对他进行包装。

在这段代码中有几个地方可以封装。

1:创建WebRequest的代码可以封装。

WebRequest webRequest  = WebRequestCreator.ClientHttp.Create(
                
new  Uri( " http://localhost:19598/ProductService.svc/Product " ));
            webRequest.ContentType 
=   " application/json " ;
            webRequest.Method 
=   " PUT " ;

 

 2:序列化数据到requestStream对象中可以封装。

复制代码
 Stream requestStream  =  webRequest.EndGetRequestStream(requestAsyncCallback);

                    JsonObject jo 
=   new  JsonObject();
                    jo[
" Id " =  Guid.NewGuid().ToString();
                    jo[
" Name " =   " test " ;

                    
string  jsonString  =  jo.ToString();
                    
byte [] buffer  =  System.Text.Encoding.Unicode.GetBytes(jsonString);
                    requestStream.Write(buffer, 
0 , buffer.Length);
                    requestStream.Close();
复制代码

3:对返回结果执行的操作可以封装。

复制代码
WebResponse webResponse  =  webRequest.EndGetResponse(responseAsyncCallback);
                            
using  (StreamReader reader  =   new  StreamReader(webResponse.GetResponseStream()))
                            {
                                
string  result  =  reader.ReadToEnd();
                                
// MessageBox.Show(result);
                                 this .Dispatcher.BeginInvoke(()  =>
                                {
                                    MessageBox.Show(result);
                                });
                            }
复制代码

 

按照1,2,3的方式我们先从1开始。代码如下:

1:使用GetWebRequest函数获取WebRequest对象,当然了你也可以用factory,但是在目前而言,一个函数就足够了。

复制代码
///   <summary>
        
///  获取WebRequest对象
        
///   </summary>
        
///   <param name="requestUriString"> 请求的地址 </param>
        
///   <param name="httpMethod"> 请求的方法:GET,PUT,POST,DELETE </param>
        
///   <param name="contentType"> 请求的类型,json:"application/json" </param>
        
///   <returns></returns>
         public   static  HttpWebRequest GetWebRequest( string  requestUriString,
                                                    
string  httpMethod,
                                                    
string  contentType)
        {
            HttpWebRequest request 
=  (HttpWebRequest)WebRequestCreator.ClientHttp.Create( new  Uri(requestUriString));
            request.Method 
=  httpMethod;
            
            
if  ( ! string .IsNullOrWhiteSpace(contentType))
            {
                request.ContentType 
=  contentType;
            }

            
return  request;
        }
复制代码

2:封装序列化到RequestStream的过程。

Stream requestStream  =  webRequest.EndGetRequestStream(requestAsyncResult);
                SerializeDataToRequestStream(data,requestStream);
                requestStream.Close();

 SerializeDataToRequestStream方法可以对JsonObject,匿名类,DataContract修饰的类进行序列化。

View Code

 

 3:处理WebResponse。如果T是String类型则直接返回Json的string,否则使用DataContractJsonSerializer 反序列化成对象进行操作。

复制代码
  ///   <summary>
        
///  处理WebResponse
        
///   </summary>
        
///   <typeparam name="T"> WebResponse返回结果的类型 </typeparam>
        
///   <param name="webResponse"> webResponse对象 </param>
        
///   <param name="action"> 对结果的操作 </param>
         private   static   void  HandleWebResponse < T > (WebResponse webResponse, Action < T >  action)
        {
            
using  (Stream responseStream  =  webResponse.GetResponseStream())
            {
                DataContractJsonSerializer serializer 
=   new  DataContractJsonSerializer( typeof (T));
                
if  ( typeof (T)  ==   typeof ( string ))
                {
                    T responseObject 
=  (T)( object )GetStringFromStream(responseStream);
                    action(responseObject);
                }
                
else
                {
                    T responseObject 
=  (T)serializer.ReadObject(responseStream);
                    action(responseObject);
                }

            }
        }
复制代码

好了,基本框架已经搭建好了,尝试下调用GET服务吧。

复制代码
///   <summary>
        
///  调用GET方法
        
///   </summary>
        
///   <typeparam name="T"> 结果的类型 </typeparam>
        
///   <param name="requestUriString"> 请求的地址 </param>
        
///   <param name="action"> 对结果的操作 </param>
         public   static   void  InvokeGet < T > ( string  requestUriString, Action < T >  action)
        {
            HttpWebRequest webRequest 
=  GetWebRequest(requestUriString,  " GET " string .Empty);
            webRequest.BeginGetResponse((asyncResult) 
=>
            {
                WebResponse response 
=  webRequest.EndGetResponse(asyncResult);
                HandleWebResponse(response, action);                
            }, 
null );
        }
复制代码

调用GET服务比较简单,使用GET从指定的URL下载数据就可以了,那么调用POST,PUT,DELETE呢?

其实原理都比较简单,就是GetRequestStream--->写数据到RequestStream--->GetResponse。

所以可以写一个通用方法来调用PUT,POST,DELETE。

View Code

 

RestInvoker的完整代码如下:

 

View Code

 

但是我们还没有解决跨线程问题,还记得上篇文章中的this.Dispatcher.BeginInvoker吗?

但是在某些特定情况下,客户端不想调用BeginInvoker。

我们下回要修改RestInvoker,让它可以跨线程。 下回分解。。。






本文转自LoveJenny博客园博客,原文链接:http://www.cnblogs.com/LoveJenny/archive/2011/05/11/2041549.html,如需转载请自行联系原作者
目录
相关文章
|
前端开发
CSS新增样式----圆角边框、盒子阴影、文字阴影
CSS新增样式----圆角边框、盒子阴影、文字阴影
286 0
|
NoSQL 数据可视化 Redis
Mac安装Redis
Mac安装Redis
335 3
|
Web App开发 数据可视化 BI
数据可视化D3系列——饼状图
饼状图是数据统计中经常用到的另一类图表,饼图可以直观地显示一个数据系列中各项的大小与各项总和的比例,本文将使用D3上手制作一个简单的饼状图 什么是布局 布局是D3中非常重要的内容,有了布局D3才能画出复杂的矢量图。但布局并不是直接绘制图形,只是将初始数据转换成容易画图的图形语言,画图工具能读懂图形语言来进行绘制。 在绘制饼状图中,例如有一组数据[1, 2, 3],只依靠这些数据是画不出的,需要将这些数据转化为圆形的起始角度和终止角度,第一块的角度区域为[0, π/3],第二块的角度区域为[π/3, π]……绘制工具能根据这些角度值进行绘制。「布局只进行数据转换」 D3还提供其他常用图表的
数据可视化D3系列——饼状图
|
10月前
|
SQL Java 数据库连接
MyBatis-Plus高级用法:最优化持久层开发
MyBatis-Plus 通过简化常见的持久层开发任务,提高了开发效率和代码的可维护性。通过合理使用条件构造器、分页插件、逻辑删除和代码生成器等高级功能,可以进一步优化持久层开发,提升系统性能和稳定性。掌握这些高级用法和最佳实践,有助于开发者构建高效、稳定和可扩展的企业级应用。
572 13
|
11月前
lodash 的 _.isEqual 方法在处理循环引用时的表现如何?
【10月更文挑战第29天】lodash 的 `_.isEqual` 方法通过有效的引用记录和比较逻辑,能够很好地处理循环引用,为开发人员在处理复杂数据结构时提供了方便和可靠的工具。
|
SQL Java 数据库连接
JDBC连接SQL Server2008 完成增加、删除、查询、修改等基本信息基本格式及示例代码
这篇文章提供了使用JDBC连接SQL Server 2008数据库进行增加、删除、查询和修改操作的基本步骤和示例代码。
|
机器学习/深度学习 分布式计算 DataWorks
构建CTR点击模型:阿里云产品实践与技术解析
点击率(CTR)预测模型在广告和推荐系统中发挥着重要作用。本文将深入介绍如何利用阿里云相关产品搭建CTR点击模型。我们将使用MaxCompute、机器学习平台PAI、DataWorks等阿里云产品,通过代码示例和详细说明,带你一步步完成整个流程。
905 0
|
SQL Oracle 关系型数据库
实时计算 Flink版产品使用合集之Managed Memory内存的含义是什么
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
监控 前端开发 Serverless
阿里云函数计算(Function Compute,FC)是一种事件驱动的计算服务
阿里云函数计算(Function Compute,FC)是一种事件驱动的计算服务
517 1