English 中文(简体)
在现场核心创建无害环境技术服务
原标题:Creating a REST service in 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 });
}

我的URL看起来是这样的:

http://www/mydomain}/api/books http://mydomain}/api/books http://www/mydomain}/api/books. http://www.

我有正确的控制器 和所有这一切。

但是“ 站点” 却不断将我引向404页。 我已经在网络中添加了“ 忽略” 路径。 配置, 但无济于事。 如果我不得不猜测, 我认为“ 站点” 处理器在我代码有机会执行之前正在重新定位, 但我真的不知道 。

有没有人知道什么是错的?

最佳回答

Your assessment is correct. You need a processor in the httpRequestBegin pipeline to abort Sitecore s processing. See the SystemWebRoutingResolver in this answer: Sitecore and ASP.net MVC

It s also described in this article: 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();
        }
    }
}

然后在您的 httprrentBegin 配置中:

<processor type="My.SystemWebRoutingResolver, My.Classes" />
问题回答

您可能想要查看 < a href=> "http://sdn. sitecore.net/Produces/Sitecore% 20Troup% 20Troup% 20Web%20API.aspx" rel="nofollow" >Sitecore Web Api

和你正在建造的差不多

另一个选项是使用内容树、“星座”项目以及专用于此目的的子布局/布局组合:

[siteroot]/API/*/*/*/*/*/*/*/*/*

以上路径允许您在 1 至 9 个区段之间拥有任何位置 - 如果您需要更多的话, 您可能需要重新思考您的进程, 国际海事组织 。 这也保留了全部的“ 遗址核心 ” 上下文 。 当无法在文件夹中找到某个项目时, 点点试图寻找“ 全部 ” 星项, 如果存在的话, 点点会让它变成一个“ 404 ” 。

有一些方法可以用来做休息的方法和子布置(或子布置,如果你想将它们以深度分隔,以简化解析) 。

您可以选择遵循一般的“ 标准”, 并使用 Get、 PUT 和 POST 调用来与这些项目进行互动, 但随后您无法使用不使用自定义后端缓存代码的 站点缓存 。 或者, 您可以将您的 API 分割成三个不同的树 :

[siteroot]/API/GET/*/*/*/*/*/*/*/*/*
[siteroot]/API/PUT/*/*/*/*/*/*/*/*/*
[siteroot]/API/POST/*/*/*/*/*/*/*/*/*

这样可以缓存 GET 请求( 因为 GET 请求只应该获取数据, 而不是更新它) 。 请使用适当的缓存计划, 基本上它应该根据数据、 用户等的每一个变换来缓存, 如果您打算在任何这些背景中使用它 。

如果您要创建多个子插件, 我建议创建一个基础类, 处理 Get、 PUT 和 POST 的一般方法, 然后用这些类作为您的子插件的基础 。

在您的子布局中, 您只需获取请求对象, 获取路径( 以及查询是否使用查询), 分割它, 并按您使用标准路由的方式执行切换大小写逻辑 。 对于 PUT, 请使用 响应 。 ReadBinary () 。 对于 POST, 请使用 请求 。 Form 对象获取所有窗体元素, 并通过它们来处理所提供的信息( 将您的所有形式数据都放入一个单个 JSON 对象, 以字符串的形式封装起来可能比较容易( 所以. NET 视其为字符串, 因而是单个属性), 然后您在文章中只有一个元素可以根据用户指定的 POST 路径进行消毒 。

复杂? 是的, 有效? 是 。 推荐? 那么... 如果你在一个共同的环境里( 多个工地), 而且您不希望管道处理器中每个工地都发生这种处理, 那么这个解决方案就起作用了 。 如果您能够使用带有点点的 MVC, 或者没有问题改变管道处理器, 那么这很可能更有效率 。

基于内容的方法的一个好处是,上下文生命周期与标准的“遗址核心”页面(logins,等等)完全相同,所以在生命周期的这一时刻,你得到了与任何其他项目一样的控件。与此相反的是,在输入代码之前,你必须处理整个页面生命周期负荷...管道处理器可以跳过许多“遗址核心”进程,直接获取所需的数据,使其更快。

you need to have a Pipeline initializer for Routing: It will be like :

公共类公共类类初始化器

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

快乐的编码





相关问题
Allow RESTful DELETE method in asp.net mvc?

im currently setting up asp.net to accept DELETE http verb in the application. However, when i send "DELETE /posts/delete/1" i always get a 405 Method not allow error. I tried to take a look at ...

Most appropriate API for URL shortening service

I ve just finished an online service for shortening URLs (in php5 with Zend Framework); you can enter an URL and you get an short URL (like tinyurl and such sites). I m thinking about the API for ...

Use HTTPClient or HttpUrlConnection? [closed]

We re implementing a REST client on JRE 1.4. Seems two good options for a client REST framework are HttpClient and HttpUrlConnection. Is there a reason to use HttpClient over the JRE s ...

Why can t I find the truststore for an SSL handshake?

I m using the Spring RESTTemplate on the client side to make calls to a REST endpoint. The client in this case is a Spring app and Tomcat is the servlet container. I m running into issues making a ...

Which Http redirects status code to use?

friendfeed.com uses 302. bit.ly uses 301. I had decided to use 303. Do they behave differently in terms of support by browsers ?

Three Step Buyonline The RESTful way

We are re-developing our buyonline functionality and we are doing it the RESTful way. The process is a three step one and the customer is asked to enter data at each step. Let s say the three URL s ...

热门标签