1

我正在尝试在 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 的处理程序在我的代码有机会执行之前重定向,但我真的不知道。

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

4

4 回答 4

1

你的评估是正确的。您需要httpRequestBegin管道中的处理器来中止 Sitecore 的处理。请参阅SystemWebRoutingResolver此答案: Sitecore 和 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" />
于 2012-05-25T01:57:57.423 回答
1

您可能想看看Sitecore Web Api

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

于 2013-07-04T13:05:55.793 回答
0

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

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

于 2013-06-28T13:52:07.757 回答
0

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

公共类初始化器

{
        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>

快乐编码

于 2013-06-29T08:35:04.113 回答