【问题标题】:Creating a REST service in Sitecore在 Sitecore 中创建 REST 服务
【发布时间】:2012-05-25 01:03:36
【问题描述】:

我正在尝试在 Sitecore 根目录中构建 REST 服务。我的应用程序启动如下所示:

void Application_Start(object sender, EventArgs e) 
{
    RouteTable.Routes.MapHttpRoute(
        name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = System.Web.Http.RouteParameter.Optional });
}

我的网址如下所示:

http://{mydomain}/api/books

我有正确的控制器等等。

但 Sitecore 不断将我重定向到 404 页面。我在 web.config 中添加了 IgnoreUrlPrefixes 节点的路径,但无济于事。如果我不得不猜测,我会认为 Sitecore 的处理程序在我的代码有机会执行之前就重定向了,但我真的不知道。

有人知道可能出了什么问题吗?

【问题讨论】:

    标签: rest sitecore sitecore6


    【解决方案1】:

    您的评估是正确的。您需要httpRequestBegin 管道中的处理器来中止 Sitecore 的处理。请参阅此答案中的SystemWebRoutingResolverSitecore and ASP.net MVC

    这篇文章中也有描述: http://www.sitecore.net/Community/Technical-Blogs/John-West-Sitecore-Blog/Posts/2010/10/Sitecore-MVC-Crash-Course.aspx

    但我也会在此处包含代码。 :)

    public class SystemWebRoutingResolver : Sitecore.Pipelines.HttpRequest.HttpRequestProcessor
    {
        public override void Process(Sitecore.Pipelines.HttpRequest.HttpRequestArgs args)
        {
            RouteData routeData = RouteTable.Routes.GetRouteData(new HttpContextWrapper(args.Context));
            if (routeData != null)
            {
                args.AbortPipeline();
            }
        }
    }
    

    然后在您的httpRequestBegin 配置中:

    <processor type="My.SystemWebRoutingResolver, My.Classes" />
    

    【讨论】:

    • 您能否将/api 也添加到IgnoreUrlPrefixes 设置中?
    • @Alexander:我试过了,但它根本没有改变行为。你确定应该工作吗?
    • 通过使用管道,您可以保留对 Sitecore.Context 中许多值的访问权限,例如数据库、站点、语言。
    【解决方案2】:

    你可能想看看Sitecore Web Api

    这与您正在构建的几乎相同。

    【讨论】:

      【解决方案3】:

      另一个效果很好的选择是使用内容树、“星号”项和专用于此目的的子布局/布局组合:

      [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 的许多流程,直接获取您需要的数据,从而使其更快。

      【讨论】:

        【解决方案4】:

        你需要有一个用于路由的管道初始化器: 它会像:

        公共类初始化器

        {
                public void Process(PipelineArgs args)
                {
                RouteCollection route = RouteTable.Routes;
                route.MapHttpRoute("DefaultApi", "api/{controller}/{action}/{id}",
                new { id = RouteParameter.Optional });
                }
        }
        

        在配置文件中,您将拥有:

        <configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
          <sitecore>
            <pipelines>
              <initialize>
            <processor type="_YourNameSpace.Initializer,_YourAssembly" />
              </initialize>
             </pipelines>
          </sitecore>       
        </configuration>
        

        快乐编码

        【讨论】:

          猜你喜欢
          • 2011-04-01
          • 1970-01-01
          • 2016-12-13
          • 2011-12-21
          • 2014-03-10
          • 2013-11-04
          • 1970-01-01
          • 1970-01-01
          • 2018-07-09
          相关资源
          最近更新 更多