나는 몇 달 전에 나에게 거의 같은 질문을했다. 나의 대답은 나의 실현의 예를 설명한다.서버 측에
나는
GET /Service/RequestedData?param1=data1¶m2=data2…
GET /Service/RequestedData/IdOfData?param1=data1¶m2=data2…
PUT /Service/RequestedData/IdOfData // with param1=data1¶m2=data2… in body
POST /Service/RequestedData/IdOfData // with param1=data1¶m2=data2… in body
DELETE /Service/RequestedData/IdOfData
그래서 요청에 대한 REST에 다음 형식 중 하나에 요청을받을 WFC 서비스를 가지고 있지만, GET
요청은 몇 가지 옵션 매개 변수가 있습니다. 특히이 부분은 관심있는 항구입니다. WFC는 URL 템플릿을 지원하기 때문에
는 클라이언트 요청에 응답 함수의 프로토 타입은
GET /Service/RequestedData?param1=¶m2=data2
GET /Service/RequestedData?param2=data2¶m1=
GET /Service/RequestedData?param2=data2
같은
[WebGet (UriTemplate = "RequestedData?param1={myParam1}¶m2={myParam2}",
ResponseFormat = WebMessageFormat.Json)]
[OperationContract]
MyResult GetData (string myParam1, int myParam2);
같은 모든 요청이 측면에서 동일한 호출로 매핑됩니다 보인다 내 WCF 서비스. 그래서 나는 한 가지 문제를 덜 갖는다.
이제 응답 내가 HTTP 헤더 "캐시 제어 : 최대 사용 기간 = 0"로 설정 GET
요청을하여 HTTP하기 위해 모든 방법의 구현의 시작 부분에. 클라이언트가 인 경우 항상은 클라이언트 브라우저 캐시를 확인하려고 시도하며, ajax
요청은 Internet Explorer처럼 로컬 캐시에서 쉽게 응답하지 않습니다.
다음으로 나는 내 데이터에 따라 항상 ETag
을 계산합니다. 정확한 알고리즘은 별도의 토론 주제이지만 중요한 것은 HTTP GET
요청에 대한 모든 응답에서 HTTP 헤더에 ETag
이 존재한다는 것입니다.
그래서 클라이언트는 항상 로컬 캐시를 확인하고 서버에 GET 요청을 보냅니다. 그들은 로컬 캐시의 "If-None-Match
"HTTP 헤더 안에있는 ETag
을 보냅니다. 서버는이 GET 요청으로 다시 전송 될 데이터가있는 ETag
을 계산합니다. 데이터의 ETag
은 클라이언트 요청 서버에서와 같이 비어있는 본문과 "304 Not Modified
"코드와 함께 응답을 되돌려 보내는 것과 같습니다. 이 경우 브라우저는 로컬 캐시에서 데이터를 제공합니다.
알려지지 않은 이유로 동일한 클라이언트가 웹 브라우저에서 새 URL로 해석 할 새 버전의 URL 요청을 생성하면 웹 브라우저는 로컬 캐시에서 이전 서버 응답을 찾지 않고 전송합니다. 한 번 더 서버에 동일한 요청을 보냅니다. 진짜 문제인가? 서버는 데이터를 한 번 더 보냅니다. 서버 측 캐싱을 사용하면 좀 더 최적화 할 수 있습니다. 대부분의 경우 GET 요청의 URL은 클라이언트 측 JavaScript에 의해 생성되므로 시간이 없어도 이러한 상황이 발생합니다.
ETag
의 계산과 "Cache-Control: max-age=0
"와 Etag
헤더뿐만 아니라 설정의 설정은 "304 Not Modified
"코드는 WFC 서비스를해야하지만, 그것은 매우 간단합니다.
가장 중요한 것은 ETag
계산은 데이터베이스 서버에서 전체 데이터를 가져 와서 계산 MD5 캐시를 계산하는 것만 큼 커지는 것이 아니라는 것입니다. SQL Server 데이터베이스의 모든 데이터 행에 영구적으로 rowversion
데이터 형식을 사용합니다. 이 rowversion
은 데이터베이스의 변경 카운터입니다. 하나의 데이터 행을 변경하면 해당 행의 값 rowversion
값이 증가합니다. 따라서 최대 값이 rowversion
인 SELECT
문장을 이전 요청과 비교하여 변경하지 않으면이 기간 동안 데이터가 변경되지 않았 음을 확인할 수 있습니다.ETa
g의 계산 알고리즘은 테이블에서 데이터를 삭제하는 경우에만 민감해야합니다. 그러나 그것은 또한 해결 된 문제입니다. 이것에 관해서는 Concurrency handling of Sql transactrion에서 더 읽을 수 있습니다.
나는 ETag
을 최선의 선택으로 추천하고 싶지 않으며, 단지 ETag
의 계산은 전체 데이터로부터 계산 MD5로 훨씬 더 저렴할 수 있습니다.
오류의 경우 서버는 throw 문에서 정의한 HTTP 코드에 매핑되는 예외를 throw합니다. 본문 WFC로 표준 JSON 개체 {"description":"My error text"}
보냅니다. 사용자 정의 오류 객체도 가능합니다 (Is WebProtocolException included in .net 4.0? 참조). 클라이언트 측에서는 jQuery를 사용하고 오류 이벤트 처리기 내부의 jQuery.ajax
에 오류 메시지가 디코딩되어 사용자에게 표시됩니다.
내 권장 사항 : 모든 HTTP GET
요청에 대해 Cache-Control: max-age=0
과 함께 ETag
을 사용하십시오. 다른 모든 요청에 대해서는 RESTfull 서비스를 구현하는 것이 좋습니다. 오류 구현을 위해서는 서버 및 클라이언트 구현에 사용되는 소프트웨어가 지원하는 가장 원시적 인 방법을 살펴보고이를 사용해야합니다.
업데이트 됨 : URL 구조를 지우려면 다음을 추가해야합니다. 내 서비스에서 GET /Service/RequestedData/IdOfData
과 같은 주요 부분은 요청 된 데이터 객체를 설명합니다. 매개 변수 param1=data1¶m2=data2
은 대부분 에 대한 정보 인, 페이징 및 의 데이터를 나타냅니다. 나는 jQuery에 대한 활성 jqGrid 플러그인을 사용하고 최종 사용자가 그리드에서 다음 페이지로 스크롤하는 경우 열 머리글 (데이터 정렬)을 클릭하거나 검색 기능과 관련하여 필터를 설정하면 이들 모두가 다른 선택적 매개 변수가 기본 URL에 추가되었습니다.
합의가 2를 사용하는 것으로 보입니다. 이쪽으로 가겠습니다. – daxim