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

简介: 来个索引 SilverLight企业应用框架设计【四】实体层设计+为客户端动态生成服务代理(自己实现RiaService) SilverLight企业应用框架设计【三】服务端设计 SilverLight企业应用框架设计【二】框架画面 SilverLight企业应用框架设计【一】整体说明 ...

来个索引

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调用的方法有点像呢?

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

估计再写一篇就完结了

下一篇公布源码

目录
相关文章
|
1月前
|
SQL JSON 数据格式
SPL 处理多层 JSON 数据比 DuckDB 方便多了
esProc SPL 处理多层 JSON 数据比 DuckDB 更便捷,尤其在保留 JSON 层次与复杂计算时优势明显。DuckDB 虽能通过 `read_json_auto()` 将 JSON 解析为表格结构,但面对深层次或复杂运算时,SQL 需频繁使用 UNNEST、子查询等结构,逻辑易变得繁琐。而 SPL 以集合运算方式直接处理子表,代码更简洁直观,无需复杂关联或 Lambda 语法,同时保持 JSON 原始结构。esProc SPL 开源免费,适合复杂 JSON 场景,欢迎至乾学院探索!
|
2月前
|
XML JSON API
如何在 Postman 中上传文件和 JSON 数据
如果你想在 Postman 中同时上传文件和 JSON 数据,本文将带你一步一步地了解整个过程,包括最佳实践和技巧,让你的工作更轻松。
|
2月前
|
人工智能 自然语言处理 JavaScript
测试工程师要失业?Magnitude:开源AI Agent驱动的端到端测试框架,让Web测试更智能,自动完善测试用例!
Magnitude是一个基于视觉AI代理的开源端到端测试框架,通过自然语言构建测试用例,结合推理代理和视觉代理实现智能化的Web应用测试,支持本地运行和CI/CD集成。
322 15
测试工程师要失业?Magnitude:开源AI Agent驱动的端到端测试框架,让Web测试更智能,自动完善测试用例!
|
2月前
|
JSON JavaScript 前端开发
如何在 Postman 中发送 JSON 数据
我们将深入探讨使用 Postman 发送 JSON 数据这一主题,Postman 是一款强大的 API 测试和开发工具。无论您是经验丰富的开发人员还是新手,掌握这项技能对于高效的 API 测试和开发都至关重要。
|
2月前
|
JSON Java 数据库连接
怎样用 esProc 计算来自 Restful 的多层 json 数据
esProc 是一款强大的数据处理工具,可简化 Java 处理 Restful 接口返回的复杂多层 JSON 数据的难题。通过 esProc,不仅能轻松访问和解析 Restful 数据,还能高效完成复杂计算任务,并可无缝嵌入 Java 应用中作为计算引擎使用。例如,筛选特定分类订单或计算金额,esProc 的脚本简洁直观,远优于传统 SQL 或纯 Java 实现。此外,esProc 支持安全认证(如 Cookie 和 Token)及 JDBC 集成,为开发者提供灵活高效的解决方案。
|
3月前
|
XML JSON API
淘宝商品详情API的调用流程(python请求示例以及json数据示例返回参考)
JSON数据示例:需要提供一个结构化的示例,展示商品详情可能包含的字段,如商品标题、价格、库存、描述、图片链接、卖家信息等。考虑到稳定性,示例应基于淘宝开放平台的标准响应格式。
|
3月前
|
JSON Java 数据格式
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——封装统一返回的数据结构
本文介绍了在Spring Boot中封装统一返回的数据结构的方法。通过定义一个泛型类`JsonResult&lt;T&gt;`,包含数据、状态码和提示信息三个属性,满足不同场景下的JSON返回需求。例如,无数据返回时可设置默认状态码&quot;0&quot;和消息&quot;操作成功!&quot;,有数据返回时也可自定义状态码和消息。同时,文章展示了如何在Controller中使用该结构,通过具体示例(如用户信息、列表和Map)说明其灵活性与便捷性。最后总结了Spring Boot中JSON数据返回的配置与实际项目中的应用技巧。
191 0
|
3月前
|
JSON Java fastjson
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——使用 fastJson 处理 null
本文介绍如何使用 fastJson 处理 null 值。与 Jackson 不同,fastJson 需要通过继承 `WebMvcConfigurationSupport` 类并覆盖 `configureMessageConverters` 方法来配置 null 值的处理方式。例如,可将 String 类型的 null 转为 &quot;&quot;,Number 类型的 null 转为 0,避免循环引用等。代码示例展示了具体实现步骤,包括引入相关依赖、设置序列化特性及解决中文乱码问题。
85 0
|
3月前
|
JSON Java fastjson
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——Spring Boot 默认对Json的处理
本文介绍了在Spring Boot中返回Json数据的方法及数据封装技巧。通过使用`@RestController`注解,可以轻松实现接口返回Json格式的数据,默认使用的Json解析框架是Jackson。文章详细讲解了如何处理不同数据类型(如类对象、List、Map)的Json转换,并提供了自定义配置以应对null值问题。此外,还对比了Jackson与阿里巴巴FastJson的特点,以及如何在项目中引入和配置FastJson,解决null值转换和中文乱码等问题。
223 0
|
4月前
|
数据采集 JSON 测试技术
如何在Python中高效实现CSV到JSON的数据转换
在实际项目中,数据格式转换是常见问题,尤其从CSV到JSON的转换。本文深入探讨了多种转换方法,涵盖Python基础实现、数据预处理、错误处理、性能优化及调试验证技巧。通过分块处理、并行处理等手段提升大文件转换效率,并介绍如何封装为命令行工具或Web API,实现自动化批量处理。关键点包括基础实现、数据清洗、异常捕获、性能优化和单元测试,确保转换流程稳定高效。
219 83