2012-05-25 5 views
1

Sitecore 루트에서 REST 서비스를 작성하려고합니다.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 : // {사용자 도메인}/API/책

내가 올바른 컨트롤러와 모든 것을 가지고있다.

하지만 Sitecore는 나를 404 페이지로 리디렉션합니다. web.config의 IgnoreUrlPrefixes 노드에 대한 경로를 추가했지만 사용할 수 없습니다. 추측해야만한다면, 내 코드가 실행될 기회를 얻기 전에 Sitecore의 핸들러가 리디렉션되고 있다고 생각 하겠지만 실제로는 알 수 없습니다.

누구에게 잘못된 생각이있을 수 있습니까?

답변

1

귀하의 의견은 정확합니다. Sitecore의 처리를 중단하려면 httpRequestBegin 파이프 라인에 프로세서가 있어야합니다. Sitecore and ASP.net MVC

그것은 또한이 문서에서 설명하는 것 : http://www.sitecore.net/Community/Technical-Blogs/John-West-Sitecore-Blog/Posts/2010/10/Sitecore-MVC-Crash-Course.aspx

를하지만 나뿐만 아니라 여기에 코드가 포함되어 있습니다이 답변에 SystemWebRoutingResolver를 참조하십시오. :) 당신의 httpRequestBegin 구성에서 다음

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(); 
     } 
    } 
} 

는 :

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

'/ api'를'IgnoreUrlPrefixes' 설정에 추가 할 수 있습니까? –

+0

@ Alexander : 나는 그것을 시도했지만 행동을 전혀 바꾸지 않았다. 너는 일해야하는 자격 자니? –

+2

파이프 라인을 사용하면 Sitecore.Context의 많은 값에 대한 액세스를 유지할 수 있습니다 (예 : 데이터베이스, 사이트, 언어. – techphoria414

0

내가 좋은 효과를 사용한 또 다른 옵션은, 컨텐츠 트리의 "스타"항목 및 sublayout을 사용하는 것입니다 - 당신은 그 이상을 필요로하는 경우, 당신은 아마 당신의 PROC을 재고 할 필요가

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

위의 경로는 어디서든 1 ~ 9 세그먼트를 가질 수 있습니다 :이 목적에 전념/레이아웃 조합 , IMO. 이것은 또한 모든 Sitecore 컨텍스트를 유지합니다. Sitecore는 폴더에서 항목을 찾을 수없는 경우 범용 모든 별 항목을 찾고 시도하면 404 항목을 반환하는 대신 해당 항목을 렌더링합니다.

다음과 같은 몇 가지 방법으로 (또는 파싱을 단순화하기 위해 심도별로 분리하려는 경우 하위 레이아웃)을 사용합니다.

일반 "표준"을 따르고 GET, PUT 및 POST 호출을 사용하여 이러한 항목과 상호 작용할 수 있지만 사용자 지정 백엔드 캐싱 코드없이 Sitecore Caching을 사용할 수는 없습니다. 또는, 당신은 세 가지 다른 나무로 API를 분할 할 수 있습니다 :

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

이는 GET 요청을 캐시 할 수 있습니다 (GET 요청은 데이터를 검색해야하기 때문에, 그것을 갱신하지 않음). 적절한 캐싱 스키마를 사용하십시오. 본질적으로 데이터, 사용자 등의 모든 순열을 기반으로 캐싱해야합니다.

여러 개의 하위 레이아웃을 만드는 경우 GET, PUT 및 POST에 대한 일반적인 방법을 처리하는 기본 클래스를 만든 다음이 클래스를 하위 레이아웃의 기본으로 사용하는 것이 좋습니다.

하위 레이아웃에서는 표준 라우팅에서와 마찬가지로 요청 개체를 가져 와서 경로를 가져 와서 쿼리를 사용하고 있는지 쿼리하고 분할하고 스위치 사례 로직을 수행하기 만하면됩니다. PUT의 경우 Response.ReadBinary()를 사용하십시오. POST의 경우 Request.Form 객체를 사용하여 모든 양식 요소를 가져 와서 제공된 정보를 처리하도록 반복합니다. 양식 데이터를 모두 하나의 JSON 객체에 넣고 문자열로 캡슐화하는 것이 가장 쉽습니다 (예 : .NET 문자열 및 따라서 하나의 단일 속성으로 표시됨) 사용자가 지정한 POST 경로에 따라 비 직렬화 할 게시물의 요소가 하나만 있습니다.

복잡합니까? 예, 작동합니까? 공유 환경 (여러 사이트)에서 파이프 라인 프로세서의 모든 사이트에 대해이 처리 작업을 원하지 않는 경우이 솔루션이 작동합니다 .MacCache를 Sitecore와 함께 사용하거나 파이프 라인을 변경하는 데 문제가없는 경우 프로세서를 사용하는 것이 더 효율적입니다.

하나의 b 컨텍스트 기반 라이프 사이클은 표준 Sitecore 페이지 (로그인 등)와 완전히 동일하므로 라이프 사이클의 모든 시점에서 다른 모든 항목과 동일한 컨트롤을 사용할 수 있습니다. 네거티브는 코드에 도달하기 전에 전체 페이지 라이프 사이클로드를 처리해야한다는 것입니다. 파이프 라인 프로세서는 Sitecore의 많은 프로세스를 건너 뛸 수 있으며 직접 필요한 데이터를 가져와 더 빨리 만들 수 있습니다.

0

당신은 라우팅을위한 파이프 라인 초기화가 필요합니다 : 그것은있을 것 을 같은 :

공용 클래스 이니셜 라이저

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

config 파일에서 당신은해야합니다 :

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

행복 코딩

1

0123을보고 싶을 수도 있습니다.

건물과 거의 같습니다.