另一种效果很好的选择是使用内容树、“星”项和专用于此目的的子布局/布局组合:
[siteroot]/API/*/*/*/*/*/*/*/*/*
上述路径允许您拥有 1 到 9 个段之间的任何位置 - 如果您需要更多,您可能需要重新考虑您的流程,IMO。这也保留了所有 Sitecore 上下文。Sitecore 在无法在文件夹中找到项目时,会尝试查找包罗万象的明星项目,如果存在,它会呈现该项目而不是返回 404。
有几种方法可以执行 restful 方法和子布局(或子布局,如果您想按深度分离它们以简化解析)。
您可以选择遵循通用“标准”并使用 GET、PUT 和 POST 调用与这些项目进行交互,但是如果没有自定义后端缓存代码,您将无法使用 Sitecore Caching)。或者,您可以将 API 拆分为三个不同的树:
[siteroot]/API/GET/*/*/*/*/*/*/*/*/*
[siteroot]/API/PUT/*/*/*/*/*/*/*/*/*
[siteroot]/API/POST/*/*/*/*/*/*/*/*/*
这允许缓存 GET 请求(因为 GET 请求应该只检索数据,而不是更新它)。确保使用正确的缓存方案,如果您打算在任何这些上下文中使用它,则基本上这应该基于数据、用户等的每个排列进行缓存。
如果要创建多个子布局,我建议创建一个处理 GET、PUT 和 POST 的通用方法的基类,然后将这些类用作子布局的基础。
在您的子布局中,您只需获取 Request 对象、获取路径(如果您正在使用查询,则查询)、拆分它并执行您的 switch case 逻辑,就像您使用标准路由一样。对于 PUT,使用 Response.ReadBinary()。对于 POST 使用 Request.Form 对象来获取所有表单元素并遍历它们以处理提供的信息(将所有表单数据放入单个 JSON 对象中,封装为字符串可能是最简单的(所以 .NET将其视为一个字符串,因此只有一个属性),然后您在帖子中只有一个元素可以根据用户指定的 POST 路径进行反序列化。
复杂?是的。作品?是的。受到推崇的?好吧...如果您处于共享环境(多个站点)中,并且您不希望管道处理器中的每个站点都进行此处理,那么此解决方案有效。如果您可以将 MVC 与 Sitecore 一起使用,或者在更改管道处理器时没有问题,那么这可能会更有效。
基于内容的方法的一个好处是上下文生命周期与标准 Sitecore 页面(登录等)完全相同,因此您拥有与生命周期中任何其他项目在该点提供的所有相同控件。不利的是,您必须在加载到您的代码之前处理整个页面生命周期加载......管道处理器可以跳过很多 Sitecore 的进程,直接获取您需要的数据,使其更快。