2015-01-20 3 views
4

ODataController 대신 ApiController에서 상속 한 컨트롤러의 메서드에 OData v4 쿼리 지원을 추가하는 데 어려움을 겪고 있습니다. 솔루션에 실제로 작동하는 OData 모델이 있지만 실제로 모델에 속하지 않는 일부 끝 점이 있지만 쿼리의 힘이 유용합니다.WebApi ApiController에서 OData v4 쿼리 사용

저는 IQueryable을 반환하고 EnableQuery를 사용할 수 있다고 제안하는 기사를 보았습니다.

public class TestController : ApiController 
{ 
    [HttpGet]  
    [EnableQuery] 
    public IQueryable<TestObject> Events() 
    { 
     var result = new[] { new TestObject { Id = "1" } }.AsQueryable(); 
     return result; 
    } 
} 

public class TestObject 
{ 
    public string Id { get; set; } 
} 

가 내가 돌아올 모든 호출/시험/이벤트가 가능한 406 아니, 난 보통 I를 의미 중 하나로, OData를 다루는 많은으로 실행했습니다 뭔가 : 여기

내 샘플 코드 OData 프레임 워크가 좋아하지 않는 것을 반환합니다. 나는 프레임 워크에서 더 이상 정보를 얻을 수 없었습니다 (필자는 생각하지 못했습니다). 왜 그것이 마음에 들지 않는지, 과거에 시행 착오를 통해서만 해결할 수 있었던 것입니다.

누구나이 설정이 작동하고 있습니까? 그렇다면 어떻게됩니까?

또는 406 응답 디버깅에 대한 제안 사항이 있습니까?

편집 : 알고 보니 있도록

확인 범인 되니라의 코드가 사용자 정의 ODataMediaTypeFormatter를 등록하고 그 과정에서 다른 모든 포맷터를 삭제했다 시작합니다.

문제 코드를 제거한 후 효과가있었습니다.

WebApi가 실제로 어딘가에서 406 오류가 발생했는지 기록하고 싶습니다.

+0

가 어떻게 경로를 선언? – nlips

+0

나는 컨트롤러/액션의 규칙을 사용했다. 그것은 EnableQuery 제거하면 잘 작동합니다. – Mant101

+0

Get()에 대한 작업 이름 Events() 변경이 가능합니까? – eoghank

답변

0

[EnableQuery]없이 "쿼리"마법을 수동으로 적용 할 수 있습니다.

  1. 이 모델에 전달하여 ODataQueryContext 만들기 (당신은 세계에 저장 해야하고 사용 가능하게), 및 엔티티 유형은이에 대한 쿼리입니다.
  2. Get 및 현재 URL (Request.RequestUri.AbsoluteUri)을 사용하여 HttpRequestMessage를 만듭니다.
  3. yourOntity >을 새 ODataQueryOptions <으로 만들고 컨텍스트를 전달하고 작성한 요청 메시지를 전달하십시오.
  4. 엔티티 .AsQueryable()을 사용하여 해당 객체의 ApplyTo를 호출하고 을 결과로 IQueryable <yourEntity>으로 캐스팅하십시오.

추가 조작 및 반환. 반환 유형은 IQueryable <yourEntity>이거나 "yourEntity"를 기반으로 할 필요는 없습니다. 여기

는 ODataController 방법에 대해이 작업을 수행 비슷한 구현 (기본 ODataQueryOptions으로 무료 제공)입니다 :

 public IEnumerable<Aggregate> GetOrders(ODataQueryOptions<ReportingOrder> opts, [FromUri(Name="$groupby")]string groupby, [FromUri(Name="$aggregates")]string aggregates = null) 
     { 
      var url = opts.Request.RequestUri.AbsoluteUri; 


      int? top = null; 

      if (opts.Top != null) 
      { 
       top = int.Parse(opts.Top.RawValue); 

       var topStr = string.Format("$top={0}", top.Value); 
       url = url.Replace(topStr, ""); 
       var req = new HttpRequestMessage(HttpMethod.Get, url); 

       opts = new ODataQueryOptions<ReportingOrder>(opts.Context, req); 

      } 

      var query = opts.ApplyTo(db.ReportingOrders.AsQueryable()) as IQueryable<ReportingOrder>; 

      var results = query.GroupBy(groupby, aggregates, top); 

      return results; 
     } 
관련 문제