2014-08-14 5 views
1

Web API 응용 프로그램에 Get 메서드에서 OData을 사용하면 일관성없는 결과가 나타납니다. OData 필터가 없으면 결과는 양호합니다. OData를 사용할 때 직렬화가 다르게 처리됩니까?나는 이것을 올바르게하고 있나? 하나로, OData으로OData 및 Entity Framework가있는 웹 API

:

enter image description here

내가 $ 심판 항목이 무엇인지 이해하지, 왜 랜덤이며, OData를 사용하지 않을 때는 왜 그들을 얻을하지 않습니다?

public HttpResponseMessage Get(System.Web.Http.OData.Query.ODataQueryOptions<Employee> options) 
     { 
      HttpResponseMessage response; 

      var employees = options.ApplyTo(_unitOfWork.EmployeeRepository.Get()); 

      if (employees == null) 
      { 
       response = new HttpResponseMessage(HttpStatusCode.NotFound); 
      } 
      else 
      { 
       response = Request.CreateResponse(HttpStatusCode.OK, employees); 
       response.Content.Headers.Expires = new DateTimeOffset(DateTime.Now.AddSeconds(300)); 
      } 
      return response; 
     } 

여기에 직렬화되는 클래스이다 : 여기

Web API 방법이다

public class Employee 
    { 
     [Key] 
     public string WinId { get; set; } 
     public string XML { get; set; } 
     public int EffectiveYear { get; set; } 
     public int FileKeeperGroupId { get; set; } 
    } 

편집 8/15

여기 내 WebApiConfig의

,321 0
+0

OData 사용의 의미를 명확히하지 않습니까? ApiController 대신 ODataController를 사용 하시겠습니까? OData를 사용하는 코드도 표시 할 수 있습니까? – QianLi

답변

-1

OData 개념에 익숙하지 않은 것으로 보입니다. 잘못된 관찰을 한 경우 올바르게 수정하십시오. OData는 RESTful 서비스 및 클라이언트 작성을위한 공개 표준 (an OASIS standard)이며 특정 규칙 및 규칙은 OData에 정의되어 있으며 다른 유형의 RESTful 서비스와 다릅니다. ASP.NET 웹 API는 OData 버전 1-3 및 OData 버전 4.0을 지원합니다. 웹 API 서비스에서 이러한 지원을 사용하려면 OData 서비스를 작성하고 OData 특정 클라이언트 만 서비스와 통신 할 수 있다는 점을 알아야합니다.

OData에서 직렬화는 일반적인 웹 API 서비스 처리 방식과 매우 다르게 처리됩니다. 그 이유는 OData가 특별한 처리가 필요한 매우 특별한 페이로드 종류를 가지고 있기 때문입니다. 예를 들어 OData V4 JSON 페이로드를 살펴 보겠습니다. JSON 페이로드 핸들러에는 특별한 지식이없는 많은 OData 특정 JSON 요소와 속성이 있습니다.

첨부 한 페이로드는 OData 페이로드가 아니며 OData 컨트롤러 동작을 첨부 한 컨트롤러 동작도 아닙니다. OData 서비스 작성시 자세한 내용은 ASP.NET learning site을 참조하십시오.

+1

어떻게 도움이됩니까? –

1

되지 않는 답 :

엔티티

중 하나로, OData 만들거나 기존의 두 엔티티 사이의 관계를 제거 지원 사이의 관계를 만들기 섹션에서 찾아보세요이 주제 Entity relations in odata-v4에서 설명하고있는 바와 같이
. OData v4 용어에서 관계는 "참조"입니다. 은 (중 하나로, OData v3에서, 관계는 링크 불렀다. 프로토콜 차이점이 튜토리얼에 대한 문제가되지 않습니다.)

참조가 자신의 URI를 가지고, 형태 /법인/NavigationProperty/$ 심판으로.그래서 기본적으로는 알 하나로, OData의 방법

/호스트/제품 (1)/공급자/$ 심판 :

HTTP : 예를 들어, 여기에 제품 및 공급 업체 사이의 참조 주소로 URI입니다 어떤 엔티티는 다른 엔티티의 네비게이션 속성을 갖는다. WebApi는 무엇이 무엇인지 알지 못합니다. 모든 것은 데이터를 서비스하는 것입니다. 그러나 OData를 사용하면 URL 자체에 내에서 클라이언트 측 쿼리를 만들 수 있습니다 (웹 API와 마찬가지로). odata가 백엔드를 올바르게 질의하기 위해서는 db 컨텍스트의 모든 엔티티와 관계를 알아야합니다. 이 작업은 먼저 ODataController에서 서비스 한 $ 메타 데이터를 확인하여 수행됩니다.

이 하나로, OData에 대한 자세한 최대 읽어 보시기 바랍니다 UserController

라는 컨트롤러를 가정하고, 하나로, OData는 귀하의 데이터를 둘러싼 이러한 추가 정보를 필요로한다는 생각에 익숙해 : 당신은

http://localhost/api/User/$metadata 

주보고이를 확인할 수 있습니다 데이터베이스를 올바르게 이해하기 위해서. 당신이 완전히 만족하지 않으면, 당신은 항상 당신의 linq 쿼리를 C#으로 작성하고 webapi로 붙잡을 수 있습니다. (자신을 연구 할 수있는 odata의 몇 가지 장점을 잃어 버리지 만).

새 응답 (8/15)
편집 : 아래의 의견을 바탕으로, 그것은 확실히 하나로, OData 직렬화를 문제의 원인이 아닌 JSON 직렬화이었다. 이 사이트 : PreserveReferenceHandling에서 JSON 응답에 참조를 보존하는 구성에 대해 설명합니다.

OData의 탐색 속성에 $ ref가 사용된다는 사실을 알았고 json을 직렬화 및 비 직렬화 할 때 $ ref를 사용하여 개체 참조를 추적하는 것도 발견했습니다.

개인적으로 JSON.NET이 순환 참조를 발견 할만큼 충분히 똑똑하기 때문에 필자는 개인적으로 $ ref를 그대로두고 싶습니다. 나를 믿지 않으면 Serializing Circular References을 확인하십시오. 그러나 이것은 모두 개인적인 취향입니다.

+0

클래스에 관계 또는 탐색 속성이 없으며 ODataController는 OData를 사용하기위한 필수 조건이 아닙니다. –

+0

우선, ODataController가 전제 조건이라고 결코 말한 적이 없습니다. 둘째로, 내 정보가 무효가 아니며, ODataQueryOptions를 통해 OData를 처리하는 방식에도 적용됩니다. 셋째로, 네비게이션 속성이 없기 때문에 이러한 임의의 $ ref를 얻는 이유입니다. 그렇게했다면 그 임의의 $ ref는 의미가 있습니다. $ ref에 대한 질문을하고 있지만, 왜 OData가 데이터에서이 모든 정보를 가져 오는지에 대해 묻고있는 것입니다. OData에 가지고있는 각 엔티티에는 탐색 속성이 없습니다. 잔인하지 마십시오. – sksallaj

+0

잔인한? 나는 그렇게 생각하지 않는다. 그러나 귀하의 의견이 더 도움이됩니다. 탐색 속성 (모델 참조)이없는 경우 임의의 $ ref를 얻으려면 어떻게해야합니까? 탐색 속성이 필수 조건입니까? –

관련 문제