2013-07-17 5 views
2

내 응용 프로그램에 문제가 있습니다. 웹 응용 프로그램은 꽤 크고 많은 ascx 및 VB 서버 컨트롤을 사용하여 작동합니다. 각 컨트롤은 업데이트 패널을 사용하여 다양한 부분 포스트 백을 수행합니다. 모든 것이 내 로컬 컴퓨터에서 제대로 작동하지만 응용 프로그램을 서버 (IIS)로 푸시하면 응용 프로그램이 업데이트 패널을 업데이트하는 동안 오류가 발생합니다. 다음은 오류입니다.부분적인 포스트 백이있는 오류

Sys.WebForms.PageRequestManagerServerErrorException: Object reference not set to an instance of an object. 

이 오류의 원인은 무엇인지, 어떤 제어가이 문제를 일으키는 지 추적하는 것은 확실하지 않습니다. IE의 개발자 도구를 사용하여 라이브 응용 프로그램을 디버깅하려고했습니다. 이 오류는 웹 리소스 인 MicrosoftAjaxWebForms.debug.js에서 비롯된 것 같습니다. 문제가있는 함수는 다음과 같습니다.

_endPostBack: function PageRequestManager$_endPostBack(error, executor, data) { 
    if (this._request === executor.get_webRequest()) { 
     this._processingRequest = false; 
     this._additionalInput = null; 
     this._request = null; 
    } 

    var eventArgs = new Sys.WebForms.EndRequestEventArgs(error, data ? data.dataItems : {}, executor); 
    Sys.Observer.raiseEvent(this, "endRequest", eventArgs); 
    if (error && !eventArgs.get_errorHandled()) { 
     throw error; 
    } 
}, 

데이터 변수가 null로 나타납니다. 누구나이 문제를 해결하는 방법이나 문제를 일으키는 내 페이지의 컨트롤을 구체적으로 찾는 방법을 알고 계십니까? 어떤 도움

덕분에 제이슨

+0

컴퓨터 및 배포 서버에서 프레임 워크 버전 (.NET 및 AJAX)이 동일합니까? –

+0

응답 해 주셔서 감사합니다. 예, 두 버전 모두 4.0 .Net 프레임 워크 및 AjaxcontrolToolkit dll 4.1.60919 버전에서 실행 중입니다. – jason

답변

3

이것은 실제로 나를 위해 좋은 "교훈"이었다. 응용 프로그램에 대한 약간의 배경과 내가보고있는 문제. 가능한 한 업데이트 패널을 사용하여 멋진 응용 프로그램을 만드는 응용 프로그램을 만들고 싶다고 결정했습니다. 이런 방식으로 나는 포스트 백 (backs)이나 페이지 전송이 없었던 모든 것이 동기라고 생각하게하는 사용자를위한 경험을 만들고 싶었습니다. 이 신청서는 저희 회사를위한 것이 었으며 현지 인트라넷에서도 실행되었습니다.

이 작업을 돕기 위해 응용 프로그램의 각 구성 요소가 분리되어 자체 서버 컨트롤이 만들어졌습니다. 예를 들어, gridviews, 버튼 등이있는 모달 대화 상자로 구성된 단일 사용자 컨트롤 (ASCX)에 컨트롤 그룹이 추가되었습니다. 오고가는 모든 데이터를 추적하기 위해 각 컨트롤은 세션에서 자신의 데이터를 추적합니다. 대부분의 경우 세션의이 데이터는 개체 목록이었습니다. 응용 프로그램이 늘어남에 따라 (즉, 사용자가 응용 프로그램을 사용함에 따라 세션이 늘어남) 간헐적 인 오류가 발생합니다. 이 오류는 서버로 푸시했지만 디버그 및 로컬 IIS 서버에서 로컬로 올바르게 실행될 때 발생합니다. 오류는 추적하는 데 며칠이 걸렸지 만 세션에 보관중인 개체가 산발적으로 "손실"될 수 있습니다.

우리의 IIS는 메모리 크기가 모자였습니다. 그 한계에 도달하면 IIS의 App Pool이 다시 시작되어 모든 세션이 재설정됩니다. 캡을 써야했기 때문에 로컬에서 발생하지 않았습니다. 따라서 데이터가 지속되는 방식을 다시 생각해야했습니다. 대부분의 내 데이터 (클래스를 직렬화해야 함)에 대해 뷰 상태를 사용하여 종료되었습니다. 뷰 상태를 사용할 수없는 컨트롤이 있었고 세션에 의존해야했습니다. 이 경우, 더 이상 필요하지 않을 때 모든 세션 데이터를 지우도록 호출 할 수있는 메소드를 추가했는지 확인했습니다.

미래에 나는 약간 다른 일을 할 것이라고 생각합니다. 첫째, 제 세션을 사용할 때 더 신중하십시오. 뷰 상태에 대한 제한 사항이 있는지 확실하지 않지만 아직 문제가 발생하지 않았습니다. 또한 업데이트 패널 (Ajax 컨트롤 loolkit을 함께 사용)에서 벗어나 일반 아약스에 의존 할 것이라고 생각합니다. 둘째, 업데이트 패널은 빠른 개발을 위해 만들어 지지만 비용은 부분적인 포스트 백이 더 큽니다.

관련 문제