ServiceStack과 ASP.Net 웹 API 비교


299

새로운 REST 스타일 API를 작성하고 ServiceStack을 살펴 보았습니다. 그러나 Microsoft가 새로운 MVC 4 베타의 일부로 ASP.Net Web API 프로젝트를 출시 한 것으로 나타났습니다. 새로운 웹 API 프로젝트를 본 사람이 있습니까? 각 시스템의 장단점을 줄 수 있습니까?

답변:


389

ServiceStack 프로젝트 의 주요 관리자로서 ServiceStack의 장점과 메시지 기반 디자인많은 자연적인 이점에 대한 통찰력을 가지고 있기 때문에 사용 사례가 매우 유사합니다 .

ServiceStack은 2008 년부터 마찰없는 원격 서비스의 올바른 설계 및 구현을 장려하는 단일 목표로 시작부터 OSS 실행 프로젝트로 활동 해 왔습니다.

간단하고 우아한 디자인

최고의 단순성을 추구하기 위해 MVC, WebApi (Microsoft가 생산 한 다른 모든 웹 서비스 프레임 워크)와 같은 컨트롤러가 아닌 모델에 자연스럽게 바인딩되는 대부분의 기능을 갖춘 단순하고 우아한 코어를 기반으로 구축되었습니다 . ).

메시지 기반 디자인을 채택하면보다 확장 가능하고 덜 취성적인 서비스를 홍보하고 액세스 및 통화 패턴을 단순화 하며 무료로 얻을 수있는 다른 많은 자연적인 이점을 포함 한다는 점에서 원격 서비스에 대한 우수한 접근 방식을 제공합니다 .

핵심 임무로서, 우리는 보이지 않는 비 침입 API를 유지하고 .NET 또는 웹 서비스 개발자에게 아직 익숙하지 않은 새로운 개념이나 인공 구조물을 도입하지 않기 위해 모든 단계에서 복잡성을 극복합니다.

예를 들어 IService<T>서비스 구현은 자동 유선 종속성이있는 표준 C # 클래스 일뿐입니다. 얇고 가벼운 래퍼는 코어 런타임 IHttpRequestIHttpResponse 유형에 대해 일관되고 통합 된 API를 제공하는 데 사용됩니다 . 또한 기본 ASP.NET 또는 HttpListener의 요청 및 응답 클래스에 대한 액세스를 허용하므로 ServiceStack을 사용할 때 제한을받지 않습니다.

WCF 및 WebApi와 대조

다음은 ServiceStack 및 WCF가 홍보 하는 대조되는 API 스타일에 대한 간략한 개요입니다 . WebApi는 REST-ful API 디자인을 장려한다는 점에서 WCF와 다릅니다. 2 사이의 예와 같이 이것은 ServiceStack과 WebApi 모두로 작성된 동일한 서비스로 가지고있는 유일한 알려진 예 입니다.

모범 사례 원격 서비스

ServiceStack은 단순성, 성능 및 Martin Fowlers 원격 서비스 디자인 패턴을 가능한 관용적 C #으로 수용하는 데 중점을 둔 웹 / 원격 서비스 모범 사례를 홍보하는 데 중점을두고 있습니다.

  • 외관 패턴 은 프로세스 경계를 통해 통신 할 때 어느 batchful, 대단위 인터페이스의 사용을 제안한다 -.

  • DTO 패턴 ( MSDN ) - 특수 목적 포항 강판의 사용을 지시하여 웹 서비스 응답의 와이어 형식을 생성합니다.

  • 클라이언트 게이트웨이 / DTO 모델과 서비스 인터페이스 계층 간의 클라이언트 및 서버 통신을 캡슐화 하는 게이트웨이 패턴 ( MSDN )

이러한 패턴은 관심사를 깨끗하게 분리하고 마찰이없는 반복적 개발 경험을 보장합니다.

서비스 강화

ServiceStack 웹 서비스의 핵심은 종속성이없는 자동 유선 순수 C # IService<T>인터페이스를 중심으로하며 깨끗한 POCO를 사용하여 고유 한 요청 및 응답 DTO로 웹 서비스 계약을 자유롭게 정의 할 수 있습니다. ServiceStack의 API는 실제로는 보이지 않습니다. -침습적입니다. 즉, C # 서비스 로직을 추출하여 ServiceStack 호스트 외부에서 실행하는 것이 쉽지 않습니다.

이 요지는 ServiceStack에서 단 하나의 C # .cs 클래스로 얻는 것의 좋은 예입니다 .

  • 등록 된 모든 형식의 메타 데이터 페이지
    • WSDL, XSD 및 C # 클라이언트 예제에 대한 링크
  • 인간 친화적 인 HTML 보고서보기
    • 자체 포함 된 단일 HTML 페이지 스냅 샷 (즉, 외부 참조 없음) 내장 된 JSON 웹 서비스 응답을 포함하여 데이터 스냅 샷에 프로그래밍 방식으로 액세스 할 수 있습니다.
  • 내장 미니 프로파일 러 (우수한 MVC 미니 프로파일 러 포트 )
    • SQL 프로파일 링 포함
  • JSON / JSONP, XML, JSV, CSV 및 SOAP 엔드 포인트

RestServiceBase 및 ServiceBase 클래스는 가능한 최대 재사용을 위해 사용자 정의 C # 로직을 호스팅하기위한 것입니다. 예를 들어 DTO 최초 디자인은 동일한 C # 서비스를 MQ 호스트에서 호스팅 및 실행할 수있는 경우 지연되고 프록시 된 실행을 허용합니다. 이는 RedisMQIMessageService 와 같은 호스트 를 등록 하고 /asynconeway엔드 포인트 를 통해 서비스를 호출 할 때 발생 합니다 (예 : client.SendOneWay()C # 클라이언트).

Nortwind CustomerDetails 서비스base.ResolveService<T>()에서 볼 수 있듯이 선택한 서비스의 자동 유선 인스턴스를 반환하는 방법을 사용하여 복합 서비스를 쉽게 위임하고 만들 수 있습니다 .

var ordersService = base.ResolveService<OrdersService>();
var ordersResponse = (OrdersResponse)ordersService.Get(
    new Orders { CustomerId = customer.Id });

일반 C # 객체 반환

대부분의 경우 ServiceStack은 대부분의 C # 객체를 예상대로 직렬화합니다. 다음은 가능한 반환 유형 목록입니다 ( 이 답변에서 제공 ).

  • 모든 DTO 객체-> Response ContentType으로 직렬화
  • 사용자 정의 된 HTTP 응답에 대한 HttpResult, HttpError, CompressedResult (IHttpResult)

다음 유형은 변환되지 않으며 응답 스트림에 직접 기록됩니다.

  • 흐름
  • IStreamWriter
  • byte []-애플리케이션 / 옥텟 스트림 컨텐츠 유형.

사용자 정의 HTTP 헤더 지원의 예는 이 CORS 예 에서 볼 수 있습니다. 이 CORS 예 에서는 전체적으로 또는 서비스별로 HTTP 헤더를 구성 할 수 있습니다.

HTML 지원

ServiceStack에서 HTML을 반환하는 여러 가지 옵션이 여기에 자세히 설명되어 있습니다 .

.NET을위한 가장 빠른 텍스트 및 이진 시리얼 라이저 포함

탄력적이고 빠른 시리얼 라이저는 빠른 응답 시간과 기존 클라이언트를 방해 하지 않는 버전 관리 가능한 API를 보장하기 위해 API에서 가장 중요한 요소입니다. 이것이 ServiceStack에 @marcgravell프로토콜 을 활성화하는 NuGet 옵션과 함께 .NET 용 텍스트 텍스트 시리얼 라이저가장 빠른 이유입니다 버퍼 (.NET에서 가장 빠른 이진 시리얼 라이저).

ServiceStack의 텍스트 시리얼 라이저는 매우 탄력적이며 오류없이 극단적 인 버전 관리견딜 수 있습니다 .

마찰없는 개발 경험

ServiceStack의 의견 수렴은 코드 생성없이 Sync / Async C # /. NETAsync Silverlight 클라이언트 를 기본적으로 지원하여 빠르고 타이핑 된 간결한 웹 서비스 API 엔드 투 엔드를 허용합니다.

C # 동기화 예

var response = client.Send<HelloResponse>(new Hello { Name = "World!" });

비동기 C # 예

client.SendAsync<HelloResponse>(new Hello { Name = "World!" },
    r => Console.WriteLine(r.Result), (r, ex) => { throw ex; });

순수한 JSON을 반환하기 때문에 다른 HTTP 클라이언트와 함께 사소하게 소비됩니다 (예 : jQuery를 사용하는 JS 클라이언트 예제) .

$.getJSON("http://localhost/Backbone.Todo/todos", function(todos) {
    alert(todos.length == 1);
});

높은 테스트 가능

모든 C # /. NET ServiceClient는 동일한 인터페이스를 공유하므로 동일한 단위 테스트XML, JSON, JSV, SOAP 통합 테스트로 사용할 수있는 지점으로 테스트교환이 가능 합니다.

풍부한 검증 및 오류 처리 기능 내장

Fristton-free and clean dev experience를 제공하기위한 ServiceStack에는 C # Exception을 발생 시키거나 내장 된 Fluent 유효성 검사를 사용하여 웹 서비스 클라이언트에서 쉽게 액세스 할 수있는 구조화 된 형식화 된 오류를 제공 하는 형식화 된 유효성 검사 및 오류 처리 기능이 내장되어 있습니다. 예 :

try {
    var client = new JsonServiceClient(BaseUri);
    var response = client.Send<UserResponse>(new User());
} catch (WebServiceException webEx) {
    /*
      webEx.StatusCode  = 400
      webEx.ErrorCode   = ArgumentNullException
      webEx.Message     = Value cannot be null. Parameter name: Name
      webEx.StackTrace  = (your Server Exception StackTrace - if DebugMode is enabled)
      webEx.ResponseDto = (your populated Response DTO)
      webEx.ResponseStatus   = (your populated Response Status DTO)
      webEx.GetFieldErrors() = (individual errors for each field if any)
    */
}

JavaScript에서 오류를 소비하는 것이 쉽지 않게하기 위해 경량의 ss-validation.js JavaScript 라이브러리를 사용하여 단일 코드 행으로 응답 오류를 HTML 양식 필드에 간단하게 바인딩 할 수 있습니다. SocialBootstrapApi 예제 프로젝트는 이것의 좋은 데모를 제공합니다.

ASP.NET 및 MVC와의 풍부한 통합

ServiceStack MVC 파워팩의 다시 쓰기 및 수정의에 대한 교체와 ASP.NET과 MVC의 괴롭히는 많은 타격 세션 ICacheClient 및 ISession API를 자신의 깨끗하고 의존성이없는 구현 및 캐싱 XML-지장을 ASP.NET 제공.

ServiceStack에는 또한 여러 가지 다른 AuthProvider가 내장 되어있는 새롭고보다 깨끗한 인증 및 자동 공급자 공급자 모델이 포함 되어 있습니다.

  • 자격 증명-/ auth / credentials 서비스에 게시하여 사용자 이름 / 암호 자격 증명으로 인증
  • 기본 인증-사용자가 기본 인증으로 인증 할 수 있도록 허용
  • Twitter OAuth-사용자가 Twitter에 등록하고 인증 할 수 있도록 허용
  • Facebook OAuth-사용자가 Facebook에 등록 및 인증 할 수 있도록 허용

인증 모듈은 전적으로 옵션이며 클린 ICacheClient / ISession API 및 OrmLite에 내장되어있어 세션을 메모리, Redis 또는 Memcached에 저장하고 UserAuth 정보를 OrmLite가 지원하는 RDBMS의 SQLServer, MySql, PostgreSQL, Sqlite 뿐만 아니라 Redis 데이터 저장소 또는 InMemory (개발 / 테스트에 유용).

훌륭한 문서

ServiceStack은 프레임 워크에 대한 대부분의 정보가 GitHub 위키 에서 호스팅되는 곳에 매우 잘 문서화되어 있습니다 . 프레임 워크의 다른 부분 (예 : Serializer, Redis, OrmLite)에 대한 설명서는 servicestack.net/docs/ 에서 찾을 수 있습니다.

ServiceStack.Examples 동안 프로젝트 ServiceStack의 라이브 데모 및 스타터 템플릿의 모든 소스 코드를 제공 SocialBoostsrapApi 프로젝트 Twitters 부트 스트랩 템플릿을 기반으로 ServiceStack와 MVC와 Backbone.js 단일 페이지 응용 프로그램을 개발하는 좋은 출발점을 제공합니다.

이외에도 최근 몇 년 동안 상당히 많은 정보가 Google 그룹에 포함되어 있습니다.

어디에서나 실행

(: 퀴즈 ServiceStack는 ASP.NET에서 실행하고 http-listener에 호스트와는 .NET 또는 모노 중 하나에서 호스팅 할 수있는 .NET 3.5 프레임 워크입니다 www.servicestack.net를 CentOS는 / 모노에 의해 제공됩니다). 이를 통해 ServiceStack 웹 서비스를 다음 중 하나에서 호스팅 할 수 있습니다.

.NET 3.5 및 4.0이 설치된 Windows

모노가있는 Linux / OSX

  • 아파치 + mod_mono
  • Nginx + MonoFastCGI
  • XSP
  • 콘솔 앱

오픈 소스 개발 모델로 개발

ServiceStack은 오픈 소스 개발 모델을 강력하게 믿고 있으며 오픈 소스에서 적극적으로 개발되고 처음부터 자유 OSS 라이센스 (New BSD) 로 호스팅되었습니다 . 현재 현재 47 명 이상의 개발자 로부터 공헌을 받았으며 현재 GitHub 에서 세 번째로 가장 많이 본 C # 프로젝트에 있습니다 .

단점

Microsoft가 개발하지 않았거나 사용 가능한 옵션으로 나열되지 않은 대부분의 다른 OSS .NET 프로젝트의 경우 가장 큰 단점이 동일하다고 생각합니다. 이것은 프레임 워크를 평가할 때 가장 먼저 선택되는 것이 거의 없음을 의미합니다. 대부분의 채택 자들은 ServiceStack을 최후의 수단으로 만 평가할 것입니다. WCF의 마찰과 취성 또는 선호하는 Microsoft Stack의 성능에 실망한 경우입니다.

피드백 및 커뮤니티 리소스

ServiceStack은 메일 그룹의 긍정적 인 정서에서 볼 수있는 것으로 평가 한 대부분의 사람들에 의해 긍정적 인 피드백을 받아 매우 호평을 받았습니다 . 올해 들어 @ServiceStack 트위터 계정은 즐겨 찾기에서 언급과 의견을 추적 하고 있습니다.

커뮤니티 리소스 위키 페이지 게시물, 포드 캐스트, 프리젠 테이션, 기 스트 등을 블로그에 링크 야생에서 더 ServiceStack에 대해 알 수있는 좋은 장소입니다.


30
WCF, webapi 및 현재 ServiceStack을 사용해 본 사람은 ServiceStack을 고수하십시오. 1) WCF는 불필요하게 너무 복잡합니다. 오래된 "모든 문제를 해결하자"delima입니다. 2) web-api가 너무 새롭습니다. 최종 릴리스를 기다립니다. 다중 파트 형식의 게시물도 지원하지 않습니다. 코드가 플럭스 상태입니다. 상용 앱을 실행하지 않을 것입니다. BTW,이 질문은 닫혀서는 안됩니다.
Michael Silver

13
방금 릴리스 된 ASP.NET WebAPI에 대해이를 편집 할 수 있습니까?
Blake Niemyjski

26
웹 사이트를보다 사용자 친화적으로 만드십시오. 이것은 훌륭한 도구처럼 보입니다. 그러나 귀하의 사이트는 혼란 스럽습니다. 프로젝트가 무엇이며 해결하려는 목표가 확실하지 않습니다. 반대로이 답변은 환상적입니다.
Kugel

82
이것은 실제로 웹 API와 많이 비교되지 않는 것 같습니다. 응답 시점에 Web API는 새로운 것이 었습니다. 더 이상 그렇지 않습니다. 나는 실제로 실제 고장을보고 싶어 하며이 답변이 오래되었다는 것을 두려워합니다.
George Mauer

35
ServiceStack이 v4.0부터 상업용 전용 / 이진 배포판으로 이동하고 있음을 지적 할 가치가 있습니다. 자세한 내용은 Demis의 Google+ 게시물 을 참조하십시오.
Nick Jones

137

고려해야 할 새로운 주요 차이점이 있습니다. ServiceStack은 v4부터 더 이상 사용할 수 없습니다. SS 전문가에 대한 명확한 결정이 있기 때문에 웹 API를 위해 몇 가지를 버리고 싶었습니다.

웹 API

프로 :

  1. 프로젝트에서 무료로 사용할 수 있습니다 (상업용으로 사용할 수있는 VS 라이센스가있는 경우)
  2. 여기에서 StackOverflow.com을 포함하여 Microsoft 및 웹에서 매우 높은 수준의 무료 지원을받을 수 있습니다.
  3. Microsoft 상점에서 매우 인기있는 ASP.NET MVC와 같은 다른 Microsoft 기술 스택과 빠르게 통합
  4. Microsoft 스택에서 RESTful 인증 및 권한 부여 지원 내장

단점 :

  1. SOAP를 지원하지 않습니다

부가 혜택

(웹 API에 이점이 있거나 추가 할 수있는 장단점이있는 이유를 추가하여 아래에 의견을 남겨주십시오)


84
SOAP를 지원하지 않는 것이
단점

11
MVC와 WebAPI가 공존한다는 사실은 CON입니다.
Phill December

4
ServiceStack v3은 여전히 ​​무료로 사용할 수 있으며 AFAIK는 항상 사용됩니다. 언급 한 mythz가 v4에만 해당되는 것은 아닙니다.
Kyle Gobel

14
와우, "더 이상 자유롭지 않다"는 과소 평가입니다. 직원이 10 명 이상인 회사의 개발자 당 $ 999 ?
Ryan Lundy

7
서비스 스택에서 웹 API로 전환해야하는 가장 큰 이유는 새로운 64 비트 아키텍처 요구 사항으로 iOS (Xamarin 사용)에서 서비스 스택 v3이 더 이상 지원되지 않기 때문입니다. 물론 업데이트는 유료 버전 인 v4에 있습니다.
SgtRock 2016

21

ServiceStack에 대해 많이 말할 수는 없지만 웹 API에는 많은 훌륭한 기능이 있으며 현재 버전 2입니다.

웹 API로 할 수있는 것 :

  • OWIN 응용 프로그램의 자체 호스트 (예 : 어디서나 실행)
  • async및에 대한 완벽한 지원 await.
  • 좋은 기본 템플릿과 수많은 오픈 소스 예제.
  • 훌륭한 Json.Net JSON 시리얼 라이저를 사용했습니다.
  • 기본적으로 휴식을 취하십시오 (하이퍼 미디어를 직접 수행해야 함).
  • 그리고 더...

1
이 목록의 모든 내용은 ServiceStack에도 있거나 사기로 볼 수 있습니다. 덜 인기있는 있지만 ServiceStack의 JSON 시리얼 라이저는 것입니다 훨씬 빨리 JSON.NET보다. @mythz는이 기술에 대해 매우 견실 한 견해를 가지고 있기 때문에 OWIN 지원이 구현되지 않을 것입니다 ( 이 기능 요청에 대한 그의 의견 참조 ).
ygormutti

3
3 년 전에 발표 된 이후로 업그레이드되지 않은 OWIN nuget 패키지를 살펴보면 OWIN 지원에 대한이 과대 광고의 요점을 실제로 알지 못합니다. 마이크로 소프트가 한때 시원하다고 말했기 때문에 사람들이 OWIN을 갖고 싶어하는 것 같습니다. 그렇지 않으면 아마 OWIN에 대해 전혀 듣지 못할 것입니다. 마이크로 소프트는 새 장난감 K를 선호하여 기꺼이 포기했다. 이는 마이크로 소프트가 강요 한 프로젝트를 죽이려는 강한 경향이 있기 때문에 "마이크로 소프트가 뒤에 숨어 영원히 살 것이다"라는 주장을 완화시킨다.
Alexey Zimarev

ServiceStack에 대한 경험이 없으면 왜 대답합니까?
브라이언 오그 덴


3

SS를 사용한 지 1 년이되었으며 모두 훌륭합니다. ORMLite는 순수한 마법입니다. 모바일 앱에 통합하기 위해 엄청난 MySQL DB를 다시 매핑 할 수있었습니다. 데이터베이스를 변경하지 않으면 다른 앱과 함께 PHP 백엔드와 함께 사용됩니다 ...

Mythz는 지원과 설명에 관한 예입니다. 앱 디자인 및 유지 관리의 단순성에 대한 지식을 업그레이드했습니다. 그것을 시도하고 이해합니다.

또한 SS를 WebAPI와 비교하지 마십시오. 충분하지 않습니다. SS는 도구 상자에 훨씬 더 많은 것을 제공합니다. ServiceStack.Text도 훌륭한 Automapper입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.