현재 WebApi와 WCF 데이터 서비스 간에는 다른 주요 차이점이 있지만 아무도 언급하지 않은 것 같습니다. 나는 MS가 둘을 비교하는 좋은 기사로 나오기를 바랍니다.
나는 한동안 OData와 WebApi를 따라 왔습니다. 저는 항상 몇 가지 주요 차이점을 발견했습니다.
첫째, 당신의 상사가 "MS가 WebApi를 지원하고있다"라는 말이 무엇을 의미하는지 잘 모르겠습니다. 그들이 OData를 지원하지 않는다는 의미입니까 ?? IMO, 그들은 둘 다 지원하고 있으며 현재 최소한의 겹침이 있습니다. Windows Azure Data Market은 OData를 사용하여 데이터를 노출하고, Azure Table Storage는 OData를 사용하고, SharePoint 2010은 데이터에 대한 OData 쿼리를 허용하며, Excel PowerPivot과 같은 MS의 다른 제품도이를 지원합니다. 관계형 데이터와 관련하여 매우 강력한 쿼리 프레임 워크입니다. 그리고 RESTful이기 때문에 모든 언어, 프레임 워크, 장치 등을 통합 할 수 있습니다.
OData + WCF Data Services에 대해 내가 좋아하는 점은 다음과 같습니다.
OData + WCF Data Services는 마침내 웹을 통해 데이터를 쿼리 할 때 클라이언트 응용 프로그램이보다 "표현"되도록 허용했습니다. 이전에는 항상 ASMX 또는 WCF를 사용하여 조작하기 어렵고 UI가 약간 다른 것을 원할 때마다 지속적인 변경이 필요한 견고한 웹 API를 구축해야했습니다. 클라이언트 응용 프로그램은 반환 할 기준을 지정하는 매개 변수 만 지정할 수 있습니다. 또는 내가 한 것처럼 LINQ 식을 "직렬화"하고 매개 변수로 전달 Expressions<Func<T,bool>>
하고 서버에서 다시 수화 합니다. 괜찮습니다. 작업을 완료했지만 클라이언트에서 LINQ를 사용하고 REST를 사용하여 웹을 통해 번역하고 싶습니다. 이것이 바로 OData가 허용하는 것입니다. 그리고 저는 솔루션의 "해킹"을 사용하고 싶지 않습니다.
DB 연결 문자열없이 "TRANSACT SQL"을 노출하는 것과 같습니다. Url과 whoala를 제공하기 만하면됩니다! 쿼리를 시작하십시오. 물론 WebApi와 WCF 데이터 서비스 모두 인증 / 승인을 지원하므로 액세스를 제어하고 역할 또는 기타 데이터 구성에 따라 추가 "Where"문을 추가 할 수 있습니다. SQL (View 빌드 또는 Stored Procs 등)보다는 Web Api Layer에서이 작업을 수행하고 싶습니다. 이제 응용 프로그램에서 쿼리를 직접 작성할 수 있으므로 OData를 활용하고 사용자가 자신의 결과를 정의 할 수있는 임시 및 BI보고 도구가 표시됩니다. 최소한의 제어 권한이있는 정적 보고서에 의존하지 않습니다.
Silverlight, Windows 8 Metro 또는 ASP.NET (MVC, WebForms 등)에서 개발할 때 Visual Studio의 "서비스 참조"를 WCF 데이터 서비스에 추가하기 만하면 LINQ를 사용하여 데이터를 쿼리 할 수 있습니다. 클라이언트의 "데이터 컨텍스트"는 변경 사항을 추적하고 변경 사항을 원자 적으로 서버에 다시 "제출"할 수 있음을 의미합니다. 이는 Silverlight 용 RIA 서비스와 매우 유사합니다. RIA Services 대신 WCF Data Services를 사용했지만 그 당시에는 DataAnnotations 또는 Actions를 지원하지 않았지만 지금은 지원합니다. :) WCF Data Services는 RIA Services에 비해 "투영"을 수행 할 수있는 또 다른 이점이 있습니다. 클라이언트에서. 엔터티에서 모든 속성을 반환하고 싶지 않은 경우 성능에 도움이 될 수 있습니다. "데이터 컨텍스트"보유
따라서 WCF Data Services는 특히 SQL Server 및 Entity Framework를 사용하는 경우 관계가있는 데이터가있는 경우 유용합니다. 아주 적은 코드로 REST를 통해 쿼리 가능한 데이터 + 작업 (작업 호출, 즉 워크 플로, 백그라운드 프로세스)을 신속하게 노출 할 수 있습니다. WCF 데이터 서비스가 방금 업데이트되었습니다. 새 릴리스가 출시되었습니다. 모든 새로운 기능을 확인하십시오.
WCF 데이터 서비스의 단점은 HTTP 스택을 통해 느슨해 진 "제어"입니다. 가장 큰 결함은 IQueryable<T>
컬렉션을 반환 하는 메서드에 있습니다. RIA Services 및 WebApi와 달리 IQueryable 메서드에서 논리를 개발할 수있는 전체 액세스 권한이 없습니다. RIA Services 및 WebApi에서는 .NET을 반환하는 한 원하는 코드를 작성할 수 있습니다 IQueryable<T>
. WCF Data Services에서는 Expression<Func<T,bool>>
인터셉터 메서드를 사용하여 "Where"문을 추가하는 데만 액세스 할 수 있습니다 . 실망 스러웠습니다. 현재 응용 프로그램은 RIA 서비스를 사용하고 있으며 IQueryable 논리를 제어 할 수있는 기능이 정말 필요합니다. 나는 이것에 대해 틀렸기를 바라며 나는 무언가를 놓치고있다.
또한 WCF 데이터 서비스는 아직 모든 LINQ 연산자를 완전히 지원하지 않습니다. 그래도 WebApi 이상을 지원합니다.
WebApi는 어떻습니까 ???
- 나는 Http 요청 / 응답에 대한 제어를 좋아한다.
- 따라하기 쉽습니다 (MVC 패턴 활용). 더 많은 툴링이 올 것이라고 확신합니다.
WebApi는 실제로 WCF 데이터 서비스 / OData와 같은 엔터티 데이터 모델에 관한 것이 아니기 때문에 현재로서는 (내 이해에 따라) 클라이언트 (예 : Silverlight, ASP.NET 서버 측 코드 등)에서 "데이터 컨텍스트"지원이 없습니다. 이다. IQueryable / IEnumerable을 사용하여 모델 개체 컬렉션을 노출 할 수 있지만 "데이터 컨텍스트"가 없기 때문에 엔터티가 클라이언트에로드되면 사용할 기본 키 / 외래 키 "탐색 속성"(예 : customer.Invoices)이 없습니다. 비동기 적으로 (또는 $ expand를 사용하는 한 번의 호출로)로드하고 변경 사항을 관리합니다. RIA 서비스 또는 WCF 데이터 서비스에서와 같이 클라이언트에 코드 생성 된 엔터티 데이터 모델 "표현"이 없습니다. 나는 당신이 당신의 데이터를 대표하는 클라이언트에 모델을 가질 수 없거나 가질 수 없다고 말하는 것이 아닙니다. 그러나 데이터를 수동으로 채우고 웹을 통해 검색된 각 "고객"에 대해 설정할 "청구서"를 관리해야합니다. 이것은 특히 모든 Async 작업이 진행되는 경우 까다로울 수 있습니다. 어떤 전화가 먼저 돌아올 지 모릅니다. 여기에서는 설명하기 어려울 수 있지만 RIA 서비스의 "데이터 컨텍스트"에 대해 읽어 보거나WCF 데이터 서비스 . 따라서 LOB (기간 업무) 앱을 다룰 때 이것이 저에게 중요한 문제입니다. 이것은 주로 생산성과 유지 보수성을 기반으로합니다. 데이터 컨텍스트없이 앱을 명확하게 빌드 할 수 있습니다. 특히 Silverlight, WPF 및 Windows 8 Metro에서 작업을 더 쉽게 만듭니다. 관계형 엔터티를 비동기 적으로 메모리에로드하고 Two-Binding을 사용하면 정말 좋습니다.
그렇다면 언젠가 WebApi가 클라이언트에서 "데이터 컨텍스트"를 지원할 수 있다는 의미입니까? 그럴 수 있다고 생각합니다. 또한 더 많은 도구를 사용하면 Visual Studio 프로젝트에서 데이터베이스 스키마 (또는 Entity Framework)를 기반으로 모든 CRUD 메서드를 생성 할 수 있습니다.
또한 WCF Data Services 또는 WebApi를 사용할 때 .NET에서 .NET Frameworks로만 언급한다는 것을 알고 있지만 HTML / JS도 주요 플레이어라는 것을 잘 알고 있습니다. Silverlight UI 또는 ASP.NET 서버 측 코드 등을 다룰 때 얻은 이점을 언급했습니다. HTML5 / JavaScript에서 "IndexedDB"의 출현으로 "데이터 컨텍스트"와 JavaScript의 LINQ 프레임 워크도 사용할 수 있으므로 JavaScript에서 OData 서비스를 훨씬 쉽게 쿼리 할 수 있습니다 (현재 OData와 함께 DataJS를 사용할 수 있음). 또한 KnockoutJS를 사용하여 MVVM을 지원하고 HTML / JS의 바인딩도 지원합니다. :)
현재 사용할 플랫폼을 조사하고 있습니다. 둘 중 하나를 사용해도 좋겠지 만, 다음 애플리케이션이 주로 분석 (읽기 전용)에 관한 것이고 풍부한 표현 RESTful API를 원한다는 사실을 바탕으로 OData에 의지하는 경향이 있습니다. WebApi는 $ take, $ skip, $ filter, $ orderby over Collections 만 지원하기 때문에 OData + WCF Data Services가 제공한다고 생각합니다. Projections, Includes ($ expand) 등을 지원하지 않습니다. "업데이트 / 삭제 / 삽입"이 많지 않으며 데이터는 상당히 관계 적입니다.
나는 다른 사람들이 토론에 참여하여 그들의 생각을 전하기를 바랍니다. 아직 결정 중이며 다른 의견을 듣고 싶습니다. 둘 다 프레임 워크가 훌륭하다고 생각합니다. 선택해야하는지 궁금합니다. 필요한 경우 둘 다 사용하지 않는 것이 좋습니다. 클라이언트에서는 어쨌든 REST 호출을 구축하는 것이 전부입니다. 그냥 생각 :)