2011-09-30 5 views
0

Base-64 문자 배열의 잘못된 Invalid 길이와 Base-64 문자열의 잘못된 문자의 맨 아래로 가려고했습니다.Viewstate invalid length error

사용자가 데이터베이스에서 3 초마다 요청하지 않으려 고하는 큰 데이터 덩어리를 저장하기 때문에 큰 ViewState입니다. 너무 커서 (일부 경우 4 메가) Gzip으로 압축하고 LoadPageStateFromPersistenceMedium() 및 SavePageStateToPersistenceMedium (ByVal pageViewState As Object)를 재정의하고 사용자 정의 viewstate를 작성합니다.

문제는 때로는 위의 오류가 발생합니다. 이 바닥에 도달하고, SavePageStateToPersistenceMedium을 호출 할 때 초기 View 상태 길이를 Session에 저장하고 LoadPageStateFromPersistenceMedium의 새로운 viewstate 길이와 비교하려고합니다. 내가 알아 차 렸던 것은 Viewstate의 길이가 심각하게 줄어들었고, 무엇이 이것을 일으킬 수 있는지 궁금합니다.

두 번째 문자열에 + 문자가 나타났습니다 (처음에 아무 것도 추가되지 않았는지 확인하려면 각 오른쪽의 10 개를 가져갔습니다). 또한 다른 사용자보다 한 사용자에게 더 많은 일이 일어나고 있습니다. 상대방이 처리하는 데이터에 문제가 있거나 시스템 (속도, 소프트웨어, 브라우저 등)에 물리적으로 연결되어 있음을 나타냅니다.

누구에게 아이디어가 있습니까? 또한 사용자에게 서비스를 제공하는 여러 개의 블레이드가 있으므로 하나에서 다른쪽으로 밀어 넣는 사용자가 될지 궁금해하고 있습니다.하지만이를 확인해야합니다.

나는 또한 렌더링과 관련 있다고 들었지만 viewstate가 렌더링 전에로드되었다고 생각 했습니까?

+0

페이지 렌더링시이 데이터를 저장해야합니까? 당신의 설명에서 나는 캐시에서이 데이터를 코드에서 설정하고 가져오고 컨트롤의 페이지 레이아웃을 렌더링 할 필요가 없다면 Cache도 괜찮을 것이라고 생각합니다. ViewState는 작고 페이지에만 관련되어야합니다. 더 큰 데이터는 사용자 당 세션에 저장되거나 애플리케이션 당 캐시에 저장됩니다. –

+0

@DavidePiras 나는 똑같은 생각을하고있었습니다. 나는 캐시를 사용하는 것이 더 빠르고 깨끗하다고 ​​생각한다. 또한 ViewState 문제를 해결할 때 큰 부작용이 있습니다. – JefClaes

+0

예.하지만 캐시는 응용 프로그램 전체에 적용됩니다. 저장하는 데이터가 연결된 모든 사용자마다 다르면 세션을 사용하십시오. –

답변

1

위의 내 의견에 제안 된대로 데이터 양을 실제로 모든 페이지로드에서 앞뒤로 전송해야하는지 분석하고 이해하고 결정해야합니다. 코드가 페이지에 속해 있고 일부 사용자 정의 컨트롤에 의해 사용되거나 코드 뒤에있는 코드에서 손으로 만든 캐싱 메커니즘이 사용 된 경우.

온라인에서 찾을 수있는 모든 기사를 반복하지는 않습니다. 대안으로는 해당 페이지 및 요청 당 관련있는 소량의 데이터에 대한 ViewState, 사용자 캐시 당 세션 및 애플리케이션 캐시 당 캐시가 있습니다.

더 자세한 내용은이 문서 읽기 : 모든 How to Choose From Viewstate, Session, Application, Cache, and Cookies

+0

캐시 및 세션에 여전히 저장해야한다는 문제가 있습니다. 내가 예외적 인 문제의 최하점에 먼저 도달 할 수 있는지, 나는 말했듯이, 페이지가 이것과 별개로 매우 잘 수행되고 과거에는 없었던 것처럼 여전히 오히려 보일 것이다. 게다가 세션을 사용한다면 데이터 세트의 정상적인 크기가 4MB이기 때문에 여전히 압축해야합니다. – user676767

+3

@ user676767 : 당신이 너무 잘못해서 고통 스럽습니다. 아무도, 그리고 아무도, ViewState에 5MB의 데이터 세트를 저장하는 아이디어를 지원하지 않습니다. 그건 그냥 바보 야. –

+0

> 캐시 및 세션에 여전히 저장해야한다는 문제가 있습니다. <세션 상태에서 고사하고 작은 4Mb를 저장하는 오버 헤드는 5Mb를 전송하는 오버 헤드에 비해 미미합니다. 응용 프로그램이 0 % CPU 사용률과 함께 허밍처럼 보일 수도 있지만 클라이언트가 I/O 경계에 있고 페이지로드를 기다리고 있기 때문입니다! –

0

첫째, 당신은 ViewState에 데이터의 큰 덩어리를 저장하지 않아야합니다. ViewState가 설계된 것이 아니며, 페이지의 성능을 저하시킵니다.

항상 데이터베이스의 히트 수를 제한해야하지만 다른 모든 것을 희생해서는 안됩니다. 매 요청마다 5MB 페이지를 게시하고 제공하여 웹 서버에 엄청난 스트레스를 가하고 있습니다.

데이터가 사용자별로 다르면 세션에 저장하십시오. 데이터가 사용자별로 다르면 캐싱에 적합 할 수 있습니다. 어떤 경우 이건 ViewState에 넣지 마십시오. 세션으로 데이터를 이동하면 문제가 해결됩니다.

+0

위의 다른 의견을 남겨 두었습니다. 나는 그것을 게시하기 전에 viewstate를 압축하고있다. 각 요청에 몇 백 킬로바이트로 줄어 듭니다. Session 변수를 사용하면 서버에 이러한 변수가 저장된다고 생각합니까? 그렇다면 압축 및 압축 해제와 관련하여이를 요청하는 것이 얼마나 비쌉니까? – user676767

+0

당신은 여전히 ​​요점을 놓치고있는 것 같습니다. 압축 후에도 5MB 데이터 세트는 3MB가 될 것이며 이는 낙관적입니다. ViewState는 100KB를 넘지 않아야합니다. 기본 InProc 세션은 서버의 메모리에 저장되며 그러한 대형 객체를 저장하는 데 더 적합합니다. 캐시에 저장할 수 있다면 이상적이지만 데이터가 사용자별로 다르므로 세션을 저장할 때 가장 좋습니다. –

+0

압축율은 실제로 확인한 후 10X입니다. 그러나 잘라 내기는 45kb에서 발생할 수 있지만, 다시 말하자면, 불규칙하게 (1500 개의 포스트 백에서 1) 발생할 수 있습니다. 위 질문을 한 이유는 6 개의 블레이드와 하나의 sqlserver가 그대로 긴장되어 있기 때문입니다. '적절한'것이 아니라 모든 것이 잘 작동하는 것입니다. 동시 사용자가 너무 많아서 실제로 세션으로의 변경을 고려해야 할 경우 두 가지 구현의 대체 비용을 알아야합니다. 속도가 99 %가 더 좋다면 나는 예외적 인 예외를 처리 할 수 ​​있습니다. – user676767