服务器数据暴露与列表实现技术解析
立即解锁
发布时间: 2025-08-13 02:53:26 阅读量: 18 订阅数: 25 

### 服务器数据暴露与列表实现技术解析
#### 1. WCF服务使用
在使用WCF服务时,需要考虑消息的编码格式(如二进制等)以及传输协议(如HTTP、HTTPS、TCP等)。需要注意的是,Visual Studio为WCF服务配置的默认端点常用的wsHttpBinding在Silverlight中不被支持。所以,需要显式定义一个额外的端点(或修改现有端点的配置)来实现Silverlight支持的绑定。如果自己创建WCF服务,可使用“Silverlight - Enabled WCF Service”项模板,它会以适合Silverlight应用程序使用的方式进行配置(使用Silverlight支持的绑定,并允许服务在ASP.NET兼容模式下运行)。
RIA服务和使用“Silverlight - Enabled WCF Service”项模板创建的WCF服务都不使用任何标准绑定,而是定义自定义绑定,在通过HTTP连接发送消息之前对消息进行二进制编码。这是因为Silverlight支持的绑定都没有实现消息的二进制编码。二进制编码消息的一大优势是可以显著减小服务器和客户端之间传递的消息大小。
##### 1.1 消费WCF服务
配置好服务后,可通过在解决方案资源管理器窗口中右键单击Silverlight项目,使用“添加服务引用”上下文菜单项来添加对服务的引用,然后就可以像在任何.NET应用程序中异步消费服务一样来使用它。
如果尝试添加对没有Silverlight支持的绑定端点的服务引用,服务引用仍会添加到项目中,但错误列表窗口会出现警告,指出该端点与Silverlight不兼容。项目可以编译,但尝试调用该服务会导致抛出`InvalidOperationException`异常。
##### 1.2 常见陷阱
在Silverlight中调用WCF服务时,有几个常见陷阱需要注意:
- **最大消息大小**:服务器上的WCF服务对其作为响应返回的最大消息大小有限制,Silverlight客户端对其接受的最大消息大小也有限制。虽然Silverlight客户端默认接受的最大消息大小配置为大得离谱的2GB,但Web项目中的服务默认最大消息大小为64KB。如果服务尝试返回大于此大小的响应(在返回大量数据列表时很常见),将导致抛出异常。可以通过在web.config文件中自定义绑定属性,设置一个替代的最大消息大小(以字节为单位)来修改此限制。不过,最好设计服务器/客户端通信以传输较小的消息,尽量减少数据流量,例如在向用户显示数据列表时,分页请求数据而不是一次性请求。
- **ASP.NET会话状态**:尽管Silverlight强制要求服务器调用必须异步执行,但如果Web项目中启用了ASP.NET会话状态,会发现服务器上的调用是顺序执行的,导致调用看起来比预期慢。可以使用Fiddler等工具拦截服务器的响应来判断ASP.NET会话状态是否开启。如果响应头中出现名为`ASP.NET_SessionId`的cookie,则表示ASP.NET会话状态已开启。通常,向项目中添加Global.asax文件时,ASP.NET会话状态会自动开启。这种行为仅在使用浏览器HTTP堆栈(应用程序在浏览器内运行时的默认设置)时出现。可以通过停止使用ASP.NET会话状态或使用客户端HTTP堆栈来解决此问题。
##### 1.3 服务器和客户端之间共享代码、业务对象和逻辑
RIA服务的一个重要特性是能够在服务器和客户端之间共享代码、业务对象和业务逻辑。对于普通的WCF服务,也有一个不太为人知的方法来实现共享:
- 将类和共享代码放在Silverlight类库项目中,然后在Silverlight项目和Web项目中都添加对该程序集的引用。要特别将此项目创建为Silverlight类库(而不是针对完整.NET框架的类库),因为Silverlight项目只能引用针对Silverlight运行时的程序集,而针对完整.NET框架的项目可以引用针对Silverlight运行时的程序集。这样,该程序集中包含的任何代码和业务对象就可以在客户端和服务器之间共享。
- 创建WCF服务时,使用这个共享程序集中的业务对象来暴露数据。添加服务引用时,通常会创建一个代理,其中包含与服务暴露的对象结构匹配的对象。可以配置服务引用,使其填充一个或多个给定程序集中定义的类型(而不是填充代理对象)。在“添加服务引用”对话框中选择要添加引用的服务后,点击“高级”按钮打开“服务引用设置”对话框,确保选中“在引用的程序集中重用类型”复选框,然后可以选择特定的程序集供其使用,或者让它在项目引用的所有程序集中搜索匹配的类型。这样,从服务器请求数据时,它会自动填充共享程序集中的对象,并且在将数据传回服务器时接受这些类型的对象,从而避免在与WCF服务通信时在服务的代理对象和共享程序集的业务对象之间复制数据。
#### 2. WCF数据服务
WCF数据服务(简称数据服务)是另一种基于WCF栈的数据中心通信技术,它使用OData协议将数据作为JSON或ATOM序列化的RESTful资源暴露给客户端。OData协议规定了客户端如何查询、导航和更新服务暴露的数据。客户端可以通过标准的HTTP GET调用(使用特殊构造的URI)检索数据,并通过标准的HTTP POST调用向服务器发送更新,以RESTful方式与服务进行通信。
##### 2.1 数据服务与RIA服务对比
数据服务和RIA服务有很多相似之处,可以将它们视为姊妹技术,有时会相互竞争。它们都基于WCF,并且都遵循向客户端暴露数据的模式,但各有不同的侧重点:
| 对比项 | RIA服务 | 数据服务 |
| ---- | ---- | ---- |
| 目标客户端 | 目前主要针对Silverlight客户端 | 客户端无关 |
| 代码生成 | 在客户端项目中生成代码以实现与服务的通信,一些开发者对这种无法控制的“魔法”代码生成有顾虑 | 不需要与客户端项目建立链接,也不需要代码生成,提供客户端库帮助客户端与服务交互 |
| 应用场景 | 具有丰富的模型,专为端到端Silverlight应用程序开发而设计(通过代码生成过程使服务器与客户端紧密相连) | 旨在以独立的方式将数据作为RESTful资源暴露,供各种客户端使用(如可以消费通过HTTP暴露并序列化为ATOM或JSON的数据的报告工具) |
不过,RIA服务也可以通过启用OData或使用WCF RIA服务工具包提供的功能暴露JSON端点,将数据作为RESTful资源供各种客户端使用。在编写端到端Silverlight应用程序时,结合其与客户端共享代码和验证逻辑等众多功能,RIA服务是最佳选择。但如果希望服务支持各种客户端,且与Silverlight项目没有紧密关系,数据服务是一个可行的替代方案。
##### 2.2 使用数据服务
使用“WCF Data Service”项模板向项目中添加数据服务时,需要配置它以暴露整个实体模型。还可以根据需要为该模型中的每个实体配置权限,以限制哪些实体集可以被读取、修改等,以及哪些服务操作可用。
配置好服务后,在Silverlight项目中添加对它的服务引用,这会自动添加对数据服务客户端库(System.Data.Services.Client.dll)的引用。然后就可以开始与服务交互,并对服务暴露的实体执行CRUD操作。
数据服务和RIA服务类似,也会暴露可查询的端点(通过操作返回`IQueryable`表达式)。通过使用客户端库,客户端可以针对这些端点编写LINQ查询,并在服务器上执行。不过,数据服务在客户端管理变更集时,默认情况下变更集条目是单独处理的(即提交变更时,每个操作会依次处理)。如果其中一个操作失败,可能会使数据库处于未知或不一致的状态。虽然可以将这些变更作为批处理发送到服务器,但服务器端仍然会单独处理它们,并且如果其中一个更新失败,没有事务和回滚机制。不过,可以通过挂钩到处理管道来实现事务。
#### 3. HTTP请求
尽管使用标准HTTP请求与服务器通信需要自己解析结果,工作量较大,但这也是一种与服务器
0
0
复制全文
相关推荐










