PRB: Server.Transfer를 사용하면 "뷰 상태가 잘못되었습니다" 오류 메시지가 나타난다

기술 자료 번역 기술 자료 번역
기술 자료: 316920 - 이 문서가 적용되는 제품 보기.
이 문서는 이전에 다음 ID로 출판되었음: KR316920
모두 확대 | 모두 축소

이 페이지에서

현상

HttpServerUtility.Transfer를 사용하면("page name", true) 다음과 같은 오류 메시지가 나타납니다.
이 페이지에 대한 뷰 상태가 잘못되었으며 손상되었을 수 있습니다.

원인

<pages> 요소의 EnableViewStateMac 특성이 기본적으로 true로 설정되기 때문에 이러한 문제가 발생합니다. 이 특성을 true로 설정하면 페이지가 클라이언트로 다시 게시될 때 ASP.NET이 페이지 뷰 상태에서 MAC(메시지 인증 검사)을 실행합니다. 이 검사는 페이지 뷰 상태가 클라이언트에서 수정되었는지 여부를 확인합니다. 보안상 이 특성을 true로 설정하는 것이 좋습니다.

Server.Transfer 메서드를 호출하고 두 번째 매개 변수를 true로 설정하면 QueryStringForm 컬렉션이 유지됩니다. 폼 필드 중 하나가 페이지 뷰 상태를 저장하는 숨겨진 __VIEWSTATE 폼 필드입니다. MAC는 각 페이지만 검사하기 때문에 뷰 상태 메시지 인증 검사는 실패합니다. 따라서 Server.Transfer를 호출하는 페이지 뷰 상태가 대상 페이지에서 유효하지 않습니다.

뷰 상태는 페이지 단위로 범위가 제한되기 때문에 해당 페이지에만 유효합니다. 뷰 상태를 페이지 간에 전달하지 말아야 합니다.

해결 방법

이 문제를 해결하려면 아래 방법 중 하나를 사용하십시오.

해결 방법 1

페이지 사이에서 값을 전달하여 서버 컨트롤 값을 다른 페이지에 전달하십시오. 자세한 내용은 다음 MSDN 설명서를 참조하십시오.
페이지 사이에서 서버 컨트롤 값 전달
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconpassingservercontrolvaluesbetweenpages.asp
그러면 대상 페이지에서 액세스할 컨트롤의 각 속성에 대해 공용 속성을 만들어야 합니다.

컨트롤 수가 많고 이들 컨트롤의 속성을 다른 페이지에서 액세스할 경우에도 해당 컨트롤을 공용 변수로 선언할 수 있습니다. 예를 들면 다음과 같습니다.

Page1.aspx
Public Class Page1
    Public WithEvents TextBox1 As System.Web.UI.WebControls.TextBox

    'Insert your code here.
End Class
Page2.aspx
            Dim sourcePage As Page1
            sourcePage = CType(Context.Handler, WebForm1)
            Response.Write(sourcePage.TextBox1.Text)

해결 방법 2

Server.Transfer를 호출할 때 두 번째 매개 변수(false가 기본값임)를 전달하지 마십시오. 예를 들면 다음과 같습니다.
Server.Transfer("<page name>")
이 코드는 호출되는 페이지에 QueryStringForm 필드를 보내지 않습니다. 데이터가 전달되지 않으면 ASP.NET이 MAC을 실행하지 않습니다.

추가 정보

문제를 재현하는 방법

  1. 다른 페이지로 실행을 전달하는 WebForm1.aspx 파일을 만듭니다. 다음 코드를 WebForm1.aspx에 추가합니다.
    <%@ Page language="vb" AutoEventWireup="true" %>
    
    <html>  
      <body>	
        <form id="WebForm1" method="post" runat="server">
          <asp:TextBox id="txtName" runat="server">Your Name</asp:TextBox><br>
          <asp:Button id="Button1" runat="server" Text="Submit" OnClick="Button1_Click"></asp:Button>
        </form>	
      </body>
    </html>
    
    <script runat=server>
    Sub Button1_Click(sender As Object, e As System.EventArgs)
    	Server.Transfer("WebForm2.aspx",true)
    End Sub
    
    </script>
  2. WebForm2.aspx라는 다른 .aspx 페이지를 만들어서 다음 코드를 추가합니다.
    <%@ Page language="vb" AutoEventWireup="true" %>
    
    <html>
      <body>	
        <form id="WebForm2" method="post" runat="server">
          <asp:Label id="lblName" runat="server" >Web Form 2</asp:Label>
        </form>
    	
      </body>
    </html>
    
    <script runat=server>
    Sub Page_Load(sender As Object, e As EventArgs)
    
    Dim thisPage As System.Web.UI.Page
    Dim nameTextBox As TextBox
    
    	thisPage = CType(Context.Handler, System.Web.UI.Page)
    	nameTextBox =  CType(thisPage.FindControl("txtName"), System.Web.UI.Control)
    
    	lblName.Text = "Your name is '" & nameTextBox.Text & "'."	
    	
    End Sub
    
    </script>
  3. 브라우저에서 WebForm1.aspx를 연 다음 Submit을 누릅니다.

속성

기술 자료: 316920 - 마지막 검토: 2002년 3월 14일 목요일 - 수정: 1.0
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft ASP .NET(.NET Framework에 포함)
키워드:?
kbconfig kbctrl kbprb kbsecurity kbservercontrols kbstate kbvalidation kbwebforms KB316920
더 이상 지원되지 않는 제품의 KB 내용에 대한 고지 사항
이 문서에서는 Microsoft에서 더 이상 지원하지 않는 제품에 대해 설명합니다. 따라서 이 문서는 "있는 그대로" 제공되며 업데이트되지 않습니다.

피드백 보내기

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com