2013-06-17 5 views
9

내가 RateProduct 액션에 가까운 설명 무언가를 달성하고자하지만닷넷 WebApi 중 하나로, OData 조치

[HttpPost] 
public int RateProduct([FromODataUri] int key, ODataActionParameters parameters) 
{ 
    // ... 
} 

ODataModelBuilder modelBuilder = new ODataConventionModelBuilder(); 
modelBuilder.EntitySet<Product>("Products"); 

// New Code 
ActionConfiguration rateProduct = modelBuilder.Entity<Product>().Action("RateProduct"); 
rateProduct.Parameter<int>("Rating"); 
rateProduct.Returns<int>(); 

, 내가 가지고있는 특정 반경 내에서 다른 위치를 반환 할만큼 똑똑한 위치 엔티티의 사례를 사용합니다. 그것은 대략 다음과 같이해야한다 :

[HttpPost] 
public IQueryable<Location> GetLocationsWithinRadius([FromODataUri] int key, ODataActionParameters parameters) 
{ 
    // Get the Location instance intended to be the center of the radius by using the key 
    // Do a radius search around it using (int)parameters["radius"] as the radius 
    // return the IQueryable<Location> of all location found within that radius 
} 

ODataModelBuilder modelBuilder = new ODataConventionModelBuilder(); 
modelBuilder.EntitySet<Location>("Locations"); 

// New Code 
ActionConfiguration getLocations = modelBuilder.Entity<Location>().Action("GetLocationsWithinRadius"); 
getLocations.Parameter<int>("radius"); 
getLocations.Returns<IQueryable<Location>>(); 

내가이 일을하고 반환 형식이 IQueryable<Location> 때 현재 작동하지 않는 얻을 싶어요. 반환 형식이있는 int와 같은 원시적 인 경우 내가 피들러에 게시물을 작성할 때, 다음 작동, 그렇지 않으면 다음과 같은 오류를 제공합니다 (포스트는 http://localhost:2663/odata/Locations(2112)/GetLocationsWithinRadius 같은이며, 요청 기관은 {radius: 50}입니다) :

{ 
    "odata.error":{ 
    "code":"","message":{ 
     "lang":"en-US","value":"An error has occurred." 
    },"innererror":{ 
     "message":"The 'ObjectContent`1' type failed to serialize the response body for content type 'application/json; odata=minimalmetadata; streaming=true; charset=utf-8'.","type":"System.InvalidOperationException","stacktrace":"","internalexception":{ 
     "message":"The related entity set could not be found from the OData path. The related entity set is required to serialize the payload.","type":"System.Runtime.Serialization.SerializationException","stacktrace":" at System.Web.Http.OData.Formatter.Serialization.ODataFeedSerializer.WriteObject(Object graph, ODataMessageWriter messageWriter, ODataSerializerContext writeContext)\r\n at System.Web.Http.OData.Formatter.ODataMediaTypeFormatter.<>c__DisplayClassa.<WriteToStreamAsync>b__9()\r\n at System.Threading.Tasks.TaskHelpers.RunSynchronously(Action action, CancellationToken token)" 
     } 
    } 
    } 
} 

내가 성취하려는 일을 할 수 있습니까? 그리고 만약 그렇다면, 답장 된 IQueryable<Location>이 odata paramaters와 구성 가능해 지는지 묻자. (좋을 것이다)?

감사합니다.

+0

엔티티 세트 유형이 '제품'임을 확인했습니다. 이것이 Location입니까? 또한 더 자세한 오류 정보를 얻으실 수 있습니다. 그렇다면 공유 할 수 있습니까? 도움이 될 것입니다. 'config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always'를 실행하면 더 자세한 정보를 얻을 수 있습니다. –

+0

예 - 방금 고쳤습니다 - 나쁘다. 손으로 복사하고 붙여 넣는 대신 코드를 작성했습니다. 또한 전체 오류를 표시하기 위해 게시물을 편집 중입니다. – t316

답변

18

동작 구성이 잘못되었습니다. 다음을 시도해보고 작동하는지 확인하십시오 :

//getLocations.Returns<IQueryable<Location>>(); 
getLocations.ReturnsCollectionFromEntitySet<Location>("Locations"); 
+0

흠 - 어떻게 간과했는지 모르겠습니다. 매력처럼 일했습니다. 도와 주셔서 정말 고맙습니다. 고맙습니다. – t316

+0

흠 .. 이걸 시도했지만 EnableQuery가 적용되면 406 오류가 발생하는 것 같습니다. – Worthy7

관련 문제