来个索引

SilverLight企业应用框架设计【四】实体层设计+为客户端动态生成服务代理(自己实现RiaService)

SilverLight企业应用框架设计【三】服务端设计

SilverLight企业应用框架设计【二】框架画面

SilverLight企业应用框架设计【一】整体说明

在上一节中讲到的自动生成的服务代理类核心代码,如下

        public event ServiceEventHandler Completed;public void GetAllMenu(){var si = new ServiceInvoker();si.Completed += new ServiceEventHandler(si_Completed);si.PrepareInvoke("MenuService", "GetAllMenu", typeof(List<MenuM>));si.InvokeService();}void si_Completed(object sender, ServiceEventArgs e){Completed(sender, e);}

大家注意到我们是通过ServiceInvoker来调用服务的

实例化ServiceInvoker类之后就注册了ServiceEventHandler事件

此事件是服务调用完成后触发的事件(silverlight 原生的ria service也有一个completed事件)

该事件相关代码如下

    public class ServiceEventArgs : EventArgs{//服务方法的返回值public object Result { get; set; }}public delegate void ServiceEventHandler(object sender, ServiceEventArgs e);

在si.PrepareInvoke把需要调用的服务类名,方法名,返回值类型(如果有参数,这里还会自动加入参数)

PrepareInvoke方法如下

        public void PrepareInvoke(string ClassName,string MethodName,Type ResultType,params object[] objs){className = ClassName;methodName = MethodName;resultType = ResultType;MemoryStream ms = new MemoryStream();var sb = new StringBuilder();            for(int i=0;i<objs.Length;i++){var jsonSerializer = new DataContractJsonSerializer(objs[i].GetType());jsonSerializer.WriteObject(ms, objs[i]);var objStr = Encoding.UTF8.GetString(ms.ToArray(), 0, (int)ms.Length);ms.Position = 0;sb.AppendFormat("p{0}=", i);sb.AppendFormat("{0}", objStr);sb.Append("&");}ms.Close();paramStr = sb.ToString();}

在此方法中主要是记录下这些信息,

另外把服务需要传入的参数序列化成JSON字符串

紧接着就调用InvokeService方法

代码如下

        public void InvokeService(){Uri serviceUri = new Uri("http://localhost/RTMDemo.Host/RTMDemo.Host.WCF.MenuService");HttpWebRequest request = (HttpWebRequest)WebRequest.Create(serviceUri);            request.Method = "POST";request.ContentType = "application/x-www-form-urlencoded";var requestResult = request.BeginGetRequestStream(new AsyncCallback(RequestReady), request);return;}

明眼人一看就明了了

其实就是使用HTTPWebRequest来调用服务(服务端我们托管了HttpHandler的请求)

RequestReady事件如下:

        void RequestReady(IAsyncResult asyncResult){HttpWebRequest request = asyncResult.AsyncState as HttpWebRequest;Stream stream = request.EndGetRequestStream(asyncResult);Deployment.Current.Dispatcher.BeginInvoke(delegate(){StreamWriter writer = new StreamWriter(stream);writer.Write(paramStr);writer.Write("MethodKey=RTMDemo.Host.WCF.{0}.{1}&", className,methodName);writer.Flush();writer.Close();request.BeginGetResponse(new AsyncCallback(ResponseReady), request);});}

在此事件中我们把服务类名方法名和参数写入了请求流

ResponseReady事件如下

        void ResponseReady(IAsyncResult asyncResult){HttpWebRequest request = asyncResult.AsyncState as HttpWebRequest;HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asyncResult);Deployment.Current.Dispatcher.BeginInvoke(delegate(){Stream responseStream = response.GetResponseStream();if (resultType == null){Completed(this, null);return;}try{DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(resultType);result = jsonSerializer.ReadObject(responseStream);}catch{}var se = new ServiceEventArgs();se.Result = result;Completed(this, se);});}

这个事件把服务端返回的结果(JSON数据)反序列化成实体类型,并赋值给ServiceEventArgs

然后触发了Completed事件

也就是触发我们服务端代理类的si_Completed事件

至此,调用服务端的类就解释完了

下面我们看看是怎么调用服务端的

        private void InitMenu(){var ms = new MenuService();ms.Completed += new ServiceEventHandler((o, re) =>{                var AllMenu = re.Result as List<MenuM>;Common.ViewUtility.AllMenu = AllMenu;InitTopMenu();});ms.GetAllMenu();}

看看是不是与ria service调用的方法有点像呢?

…………………………………………………………………………喜欢的话……………请推荐吧………………………………………………………

估计再写一篇就完结了

下一篇公布源码

SilverLight企业应用框架设计【五】客户端调用服务端(使用JSON传递数据,自己实现RESTful Web服务)...相关推荐

  1. SilverLight企业应用框架设计【二】框架画面

    框架画面分为上中下三层 由下面一个Grid控件完成布局 <Grid x:Name="LayoutRoot"><Grid.RowDefinitions>< ...

  2. 视频教程-热更新框架设计之客户端热更框架(中部)视频课程-Unity3D

    热更新框架设计之客户端热更框架(中部)视频课程 二十多年的软件开发与教学经验IT技术布道者,资深软件工程师.具备深厚编程语言经验,在国内上市企业做项目经理.研发经理,熟悉企业大型软件运作管理过程.软件 ...

  3. Spring Restful Web服务示例 - 使用JSON,Jackson和客户端程序

    Spring Restful Web服务示例 - 使用JSON,Jackson和客户端程序 Spring是最广泛使用的Java EE框架之一.我们之前已经看到了如何使用Spring MVC来创建基于J ...

  4. Guzzle – 构建 RESTful Web 服务的 PHP HTTP 框架

    Guzzle 减轻了发送 HTTP 请求和创建 Web 服务客户端的痛苦.它包含建立一个强大的网络服务客户端的工具,包括:服务描述定义的输入和输出的 API,资源迭代器遍历分页资源,尽可能有效地发送大 ...

  5. Spring Restful Web服务示例 - 使用JSON/Jackson和客户端程序

    Spring Restful Web服务示例 - 使用JSON/Jackson和客户端程序 Spring是最广泛使用的Java EE框架之一.我们之前已经看到了如何使用Spring MVC来创建基于J ...

  6. 年货来咯:精选年度最受欢迎干货,覆盖客户端、服务端、前端、数据、算法……...

    ????新年将至,年味渐浓.???? ????闲鱼技术年货,如期而至.???? 从2018年春到今天,我们共发布了216篇原创技术文章,开设在公众号.掘金.知乎.头条.facebook.twitter ...

  7. SpringBoot调用RESTful Web服务

    SpringBoot调用RESTful Web服务 本指南将引导您完成创建使用RESTful Web服务的应用程序的过程. 你会建立什么 您将RestTemplate在https://gturnqui ...

  8. android从服务端获取json解析显示在客户端上面,Android服务端获取json解析显示在客户端上面.doc...

    Android服务端获取json解析显示在客户端上面 Android从服务端获取json解析显示在客户端上面 首先说一下Json数据的最基本的特点,Json数据是一系列的键值对的集合,和XML数据来比 ...

  9. 客户端Mock服务端的JSON数据

    http://hlyu.cn/?p=392 http://hlyu.cn/?p=392 http://hlyu.cn/?p=392 客户端Mock服务端的JSON数据 场景1:服务端和客户端已经制定了 ...

  10. Java中Socket通信-客户端与服务端相互传输对象数据

    场景 Java中Socket通信-服务端和客户端双向传输字符串实现: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1084885 ...

最新文章

  1. java 序列化 缓存_java_缓冲流、转换流、序列化流
  2. SAP PM 初级系列3 - 主数据相关的基础设置
  3. 推荐个Spring Boot实现的开源公众号管理系统,当学习案例也不错!
  4. 超级有意思的代码注释
  5. 【收藏】Windows编译安装Redis 6.0
  6. Call调用webservice接口,使用命名空间和不使用命名空间的区别
  7. 福禄克网络TIA识别MPTL连接的操作方法
  8. 制造业物料清单BOM、智能文档阅读、科学文献影响因子、Celebrated Italian mathematician ZepartzatT Gozinto 与 高津托图...
  9. java aop注解拦截_Spring AOP 拦截指定注解标识的类或方法
  10. [密码学基础][信息安全][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第11篇]DLP、CDH和DDH问题是什么?
  11. 淘宝SDK easing属性(旋转木马)
  12. FarPoint表格数字框中小数点位数的设置
  13. XMLDOM的CComPtr的例程
  14. apue.h头文件内容
  15. Android自定义控件之TextView的展开与折叠
  16. webdriver 弹出框 java_如何使用Java处理Selenium WebDriver中的弹出窗口
  17. 人人开源renren-fast前后端
  18. Windows系统开机自动运行程序和自动启动服务
  19. top 100 percent
  20. 第17课 项目成本管理

热门文章

  1. 决策树的简单实现与可视化
  2. 微波遥感SNAP(二)——基于Sentinel-1雷达数据反演矿区地表形变
  3. ENVI学习总结(十四)——高光谱地物识别
  4. 数值分析期末复习(解线性和非线性方程组)
  5. 解决cv2.error: OpenCV(xxx) C:\projects\opencv-python\opencv_contrib\modules\xfeatures2d\src\sift.cpp问题
  6. PHP递归写入MySQL无限级分类数据
  7. html的字号txt的制作,font 文本颜色 字体 大小标签
  8. 关系抽取综述及相关顶会论文介绍
  9. 战地一的服务器在哪个文件夹,战地1怎么加入服务器 战地1加入服务器方法
  10. 源码解析 | 万字长文详解 Flink 中的 CopyOnWriteStateTable