문제

나는 내가 작업하는 제품에 대한 일부 asp.net/castle monorail 사이트와 관련하여 작은 (또는 아마도 작지 않은) 문제가 있습니다. 이것은 상당히 유산 시스템 (내 시간 전에 작성)이며 쿼리 문자열에 상당한 양의 정보가 포함 된 GET 요청을 사용합니다. 우리는 최근 쿼리 문자열 길이 제한을 실행했으며 서버로 전송 해야하는 데이터의 양에 대해 쿠키에 임시로 데이터를 저장하는 것도 그럴듯하지 않습니다 (우리는 이미 쿠키 당 4096 바이트 한계를 지났습니다. 많은 쿠키를 설정하면 도메인 당 쿠키가 가까워 질 수 있습니다.)

이 문제를 해결할 수있는 우편 (일부 경우 사후 요청으로 변경하는 것이 가능할 수도 있지만 전부는 아닐 수도 있음) 외에 대안이 있는지 궁금합니다. StackoverFlow의 다른 사람이 비슷한 문제가 발생하고 마법사 솔루션이 있습니다 (즉, JavaScript를 사용하여 데이터를 압축하고 Base64로 인코딩하고 단일 쿼리 문자열 항목으로 전달합니까? 압축 할 수있는 라이브러리가 있는지 확실하지 않습니다. .NET 3.5의 내장 압축 클래스와 호환되는 방식으로 JavaScript가있는 데이터.)

업데이트:

해결책은 임시 컨트롤러에 게시하는 것이 었습니다. 이 임시 컨트롤러는 대규모 데이터 목록을 가져 와서 공유 세션에 고착했습니다 (프로덕션 서버는 스티커 세션/IPS를 사용하지 않는 대형 멀티 뱅크 서버 팜에 있습니다). 공유 세션의 데이터. 가장 성능이 좋은 솔루션은 아니지만 문제를 해결했습니다.

도움이 되었습니까?

해결책

몇 가지가 있습니다 Base64 jQuery 용 플러그인을 인코딩합니다, 그러나 그것은 도움이되지 않습니다 Base64는 일반적으로 데이터를 더 길게 만듭니다, 더 짧지 않습니다.

데이터에 따라 다른 텍스트 압축 기술을 살펴 봅니다. Wikipedia는 몇 가지를 나열합니다:

  • 컨텍스트 트리 가중법 (CTW)
  • Burrows-Wheeler Transform (압축을보다 효율적으로 만드는 블록 정렬 전처리)
  • lz77 (deflate에서 사용)
  • LZW

여기에 있습니다 JavaScript 용 LZW 구현.

허프만 인코딩 문자 빈도를 기준으로하므로 데이터에 적합하지 않을 수 있습니다. 결과를 피하기 위해 결과를 피해야 할 것입니다.

다른 팁

게시를 게시하는 것 외에도 옵션이 제한 될 것입니다. Base64는 데이터의 크기가 감소하지 않을 것입니다. 데이터를 단일 쿼리 문자열 항목으로 압축하는 것을 언급했습니다 ... 아마도 AJAX를 사용하여 데이터를 2 개의 개별 요청으로 분할 할 수 있습니까? 그래도 그것이 당신의 상황에 대해 실현 가능한지 확실하지 않습니다.

쿼리 문자열과 같은 배열이 다음과 같이 생성되면 JSON을 데이터 전송 형식으로 사용하는 것이 좋습니다.

params[]=sth&params[]=sth2&params[]=sth3

이것은 될 것입니다

{params:['sth1', 'sth2', 'sth3']}

이 json 문자열이 아래와 같이 단일 문자 변수에 sssign 수 있습니다.

p={params:['sth1', 'sth2', 'sth3']}

더 나은 것은 압축 및 base64 전체 쿼리 문자열을 인코딩하는 것입니다. 서버 측에서 쿼리 문자열을 생성하므로 (이에 동일한 COMP/DECOMP 알고리즘을 사용하여 JS에서 동일한 작업을 수행 할 수 있음) GZIP와 같은 프로그래밍 언어와 함께 내장 압축 알고리즘을 사용할 수 있습니다. Base64가 압축 데이터를 인코딩 한 후에는 URL 인코딩만큼 확장되지는 않지만 확장되지는 않습니다.

나는 JavaScript에 너무 의존하지 않을 것입니다. 쿼리 문자열을 압축하는 것은 첫 번째 자연적인 일입니다. 그러나 그 한계를 앞서 있다면 세션을 멘토링해야합니다. 기본 상태 정보로 신선하게 시작한 다음 서버의 상태를 서버의 상태를 사용자의 세션에 제공 한 게시물 세션에 점차적으로 반영하므로 모든 데이터를 많은 핸들러 (읽기 페이지)로 분할합니다.

교과서 답변은 게시물을 사용하는 것입니다. 왜 이것이 불가능합니까? 게시물이 발명 된 이유는 Get의 길이 한계를 일으키기위한 것입니다.

세부 사항에 따라 다른 가능성은 각각 데이터의 서브 세트가있는 여러 화면을 갖고 서버에 각각의 데이터를 저장하고 끝에 연결하는 것입니다.

클라이언트 또는 서버에서 쿼리 문자열 제한이 있습니까?

문제가 클라이언트가 긴 get String을 보내지 않는 경우, 아마도 프록시 서버에 게시하여 요청을 GET로 전달할 수 있습니다.

이것은 페이지간에 상태 정보를 보유해야합니까? 그렇다면 옵션은 다음과 같은 쿠키를 사용하여 쿠키를 사용하는 것일 수 있습니다.

_SESSIONID=3F2504E0-4F89-11D3-9A0C-0305E82C3301

세션 정보 서버 측을 저장하십시오. 세션은 Guid로 독특하게 식별되므로 서버에서 직접 많은 양의 정보를 쉽게 검색 할 수 있습니다.

그런 다음 클라이언트면을 보내거나 검색 해야하는 모든 것은 해당 세션 ID 및 클라이언트 생성 정보 (GET/POST 필드).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top