2012-05-15 4 views
2

OData 규범에 따라 http://www.odata.org/documentation/uri-conventions#FilterSystemQueryOption 다음 Uri가 유효합니다. http://services.odata.org/OData/OData.svc/Category(1)/Products? $ 가기 = 2 & $ ORDERBY = ASP.NET Web-API가 Odata 리소스 경로를 지원합니까?

ASP.NET 웹-API는 (적어도 상자 밖으로)이 기능을 지원하지 않는 것 같습니다 그러나 이름

. Category (1)라는 컨트롤러를 찾을 수 없다는 오류가 발생합니다.

Web-API로이 작업을 수행하는 방법이나 해결 방법이 있습니까?

답변

3

당신이 질문했을 때 당신의 질문이 왜 주목을 끌지 모르겠군요.하지만 진짜 문제입니다. WebAPI는 많은 양의 OData 스펙을 지원하지만, 모든 것을 이해하지는 못합니다. 하지만, 나는 어떤 측면이 정확하게 작동 하는지를 설명하는 자원을 아직 찾지 못했습니다. 기본적으로 기본 경로는 하나의 중첩 계층을 지원하며 사용자의 예제에서는 두 개가 아닙니다. 그래서 뭔가가 :

mystuff.com/Category/5?$top2&orderby=name 

그런 말로, 나는 당신이 원하는 것과 같은 것을 만들 수 있다고 생각합니다. 그래서 같은 global.asax 설정에서 .... 노선 쌍/컴파일이 모든 테스트, 그래서 나와 함께 곰되지 않은 :

routes.MapHttpRoute(name   : "WithCategoryFilter", 
        routeTemplate : "api/v1/{controller}({catID})/{action}/{id}", 
        defaults  : new { id = RouteParameter.Optional}  ); 

routes.MapHttpRoute(name   : "WithoutCatFilter", 
        routeTemplate : "api/v1/{controller}/{action}/{id}", 
        defaults  : new { id = RouteParameter.Optional}  ); 

공지 순서 내가 routes-- 이 카테고리 필터를 넣어 등록 먼저. 이 노선에 대한 해당 컨트롤러처럼 보일 것입니다 :

public class ProductCategoryController : BaseAPIController { 
    public IEnumerable<Product> Products(int catID, int id) { 
     var result = new List<Product>(); 

     //do category filtering here... 

      return result; 
    } 
} 

은 그래서 첫 번째 경로는 카테고리 필터 ( catID) 및 선택적 제품 ID ( id)의 응용 프로그램을 허용합니다. categoryID & 괄호를 제외하면 두 번째 경로가 catch됩니다. 괄호를 자동으로 필터링하는 좋은 방법이 없으므로 두 경로가 필요합니다.

당신이 아마 만날 다른 경로 체조를 식별 another answer I wrote 당신이 관심이있을 수 있습니다.

+0

이전에 시도했지만 작동하지 않았습니다. api/{controller} ({resourceId})/{action}은 api/Category (1)/제품으로 변환되며 "Category (1) '컨트롤러와 일치하는 유형이 없습니다"라는 메시지와 함께 오류가 발생합니다 – Vishal

+0

답을 좀 더 자세히 살펴보십시오. 위의 방법을 시도해 보았는데 나에게 도움이되었습니다. 경로의 페어가 필요합니다. 카테고리가 제공되면 (괄호 포함) 하나는 제공되지 않을 때 작동합니다. 주문을했는데 경로를 등록했는데 네가 다른 길을 택한 것 같아 – EBarr

+0

예, 경로 순서를 변경 한 후에 작동하도록 할 수있었습니다. – Vishal

관련 문제