让我们再仔细看看图 2 中的 InitalizeService 方法还进行了什么操作。此方法为服务将提供的两个实体集调用 SetEntitySetAccessRule,并且设置对 AllRead 的访问权限。这告诉服务让两个实体集完全可读,但不允许进行插入、更新或删除。这是控制对服务的访问的极佳方法。WCF 数据服务还支持名为“查询侦听器”的方法,允许服务作者在每个实体集的基础上为服务配置更精细的访问控制。将 Listings.svc 文件设置为项目起始页,并运行项目。这将打开一个浏览器窗口并显示服务文档,如图 3 所示。
图 3 SharePoint 站点的服务文档
OData URI 约定
服务文档列出了服务提供的实体集。请记住,您可以使用强大的 URI 语法(是 OData 协议的可选部分)来访问此服务中的资源。让我们快速了解一下此服务的 URI 语法。若要访问每个实体集的源,您需要将实体集的名称附加到服务的基本 URI 中,例如 http://myhost/Listings.svc/Properties 将指向 Properties 实体集中的一组实体。
还可以使用单个实体的键值来指向该实体,例如 URI http://myhost/ Listings.svc/Properties(0) 将指向 ID = 0 的房产。您可以将关系名称附加到 URI 末尾,以指向此实体与其他实体或实体集的关系,因此 http://myhost/ Listings.svc/Properties(0)/Listings 将指向与 ID = 0 的房产实体相关的一组销售清单。使用此语法,可以浏览关系的很多层级。
URI 还定义了很多可以附加到 URI 的查询选项,以便在一定程度上修改基本查询,其中每个查询选项都定义为名称/值对。例如,附加查询选项 $top=10 后,就将查询限制为仅包含结果中的前 10 个实体。图 4 列出了 URI 语法中所有可用的查询选项。
图 4 OData 查询选项
$top=n | 将查询限制为前 n 个实体。 |
$skip=n | 跳过集中的前 n 个实体。 |
$inlinecount=allpages | 在结果中包含集中所有实体的计数。 |
$filter=<表达式> | 可以用表达式限制查询返回的结果(例如:$filter=Status eq 'Available' 将结果限制为具有 Status 属性且此属性值为 Available 的实体)。 |
$orderby=<表达式> | 按照实体的一组属性对结果进行排序 |
$select=<表达式> | 指定要返回的实体的属性子集。 |
$format | 指定要返回的源的格式(ATOM 或 JSON)。此选项在 WCF 数据服务中不受支持。 |