Troubleshooting the "View state is invalid" error with ASP.NET

การแปลบทความ การแปลบทความ
หมายเลขบทความ (Article ID): 829743 - ผลิตภัณฑ์ที่เกี่ยวข้องในบทความนี้
ขยายทั้งหมด | ยุบทั้งหมด



This article describes some techniques that can be used to debug and to resolve problems with view state in Microsoft ASP.NET applications.


View state is a feature in ASP.NET that allows pages to automatically preserve state without relying on server state (for example, session state). However, issues relating to view state can be difficult to debug. In most cases, when problems with view state occur, you receive the following error message in the Web browser, with little indication of what might be causing the issue:
"The viewstate is invalid for this page and might be corrupted"
This article describes some techniques that can be used for debugging and for resolving problems with view state.


Verify that you are not running into issues that have been fixed

A number of view state issues were fixed with ASP.NET 1.0 hotfixes and service packs, and those fixes are also part of ASP.NET 1.1. Make sure that you have applied the latest fixes before tracking issues that have already been resolved. You can obtain the latest Microsoft .NET Framework updates from the following Microsoft Developer Network (MSDN) Web site:

Set the validationKey attribute if you are running in a Web farm

In a Web farm, each client request can go to a different machine on every postback. Because of this behavior, you cannot leave thevalidationKeyattribute set toAutoGeneratein the Machine.config file. Instead, you must set the value of thevalidationKeyattribute to a fixed string that is shared by all the machines on the Web farm.

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับปัญหานี้ โปรดคลิกที่หมายเลขบทความต่อไปนี้เพื่อดูบทความใน Microsoft Knowledge Base::
323744FIX: "The view state is invalid for this page and might be corrupted" error message in ASP.NET

Do not store dynamically generated types in view state in a Web farm

When ASP.NET compiles files dynamically, the files are built into assemblies with essentially random names (for example, a file name might be jp395dun.dll). If you are running a Web farm, the same files will be compiled into assemblies with different random names. Normally, this is not a problem because no one makes assumptions on those assembly names. But if you ever put a dynamically compiled type into view state by using binary serialization, the name of the assembly will be included as part of the view state data. When that view state is later sent to a different server in the Web farm, the view state cannot be deserialized because it uses different assembly names.

The best fix to this problem is to avoid using binary serialization. Binary serialization uses many resources even when you do not run into this problem. Instead, limit what you put in view state to a combination ofArrays,Pairs,Triplets, and simple types (for example,strings,int, and other types).System.Web.UI.PairและSystem.Web.UI.Tripletare simple wrapper types that the view state engine can efficiently process.

An alternative fix to avoid this problem is to move the types that you are storing in view state into a precompiled assembly, either in your Bin folder or in the Global Assembly Cache. This fix does not address performance, but it guarantees that the assembly has the same name on all computers.

หมายเหตุ:If you store complex data types in view state and experience this issue, the call stack information will contain stacks that are similar to the following:
[FileNotFoundException: Could not load file or assembly 'App_Web_fx--sar9, Version=, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.]
 System.RuntimeTypeHandle._GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark, Boolean loadTypeFromPartialName) +0
System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark) +72
System.RuntimeType.PrivateGetType(String typeName, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark) +58
System.Type.GetType(String typeName, Boolean throwOnError) +57
System.Web.UI.ObjectStateFormatter.DeserializeType(SerializerBinaryReader reader) +192 
System.Web.UI.ObjectStateFormatter.DeserializeValue(SerializerBinaryReader reader) +943 
System.Web.UI.ObjectStateFormatter.DeserializeValue(SerializerBinaryReader reader) +384 
System.Web.UI.ObjectStateFormatter.DeserializeValue(SerializerBinaryReader reader) +198 
System.Web.UI.ObjectStateFormatter.DeserializeValue(SerializerBinaryReader reader) +210 
System.Web.UI.ObjectStateFormatter.DeserializeValue(SerializerBinaryReader reader) +198 
System.Web.UI.ObjectStateFormatter.Deserialize(Stream inputStream) +142

Determine whether the problem is related to the view state MAC feature

The purpose of the view state machine authentication code (MAC) feature is to make it impossible for clients to send a request that contains a malicious view state. By default, this feature is enabled in the following flag in the Machine.config file.
The simplest way to determine whether the issue you are dealing with is related to the MAC feature is to turn off the feature. To do this, change the flag in the Machine.config file to the following code.
If you no longer get view state errors, the problem is related to the MAC feature.

สิ่งสำคัญOnly turn off the view state MAC feature to help diagnose the problem. You should not keep the view state MAC turned off to work around the issue. If so, you could introduce security holes. For more information, visit the following MSDN Web site:
If you turn the view state MAC feature off, and then you use view state for controls that do not HTML encode (for example, aป้ายชื่อcontrol), attackers can tamper with the view state data and can put arbitrary data in view state. This arbitrary data is decoded and then used by controls when they render the posted page. As a result, attackers can inject script into the application unless you work to prevent the attack. For example, an attacker could decode the data, inject script into the data where aป้ายชื่อcontrol is, and then link to it from a Web site. Anyone who clicks on the link would be the victim of a script injection attack that could potentially steal their authentication cookies or session id. The script could also let an attacker alter state data for controls that use view state and application specific attacks could occur as a result.

In general, Microsoft recommends that you not turn off the view state MAC feature unless you are completely confident that you have either disabled view state for all controls that do not HTML encode their output (for example,DataGridcontrols,dataListcontrols,ป้ายชื่อcontrols, and other controls) or that you are always explicitly setting their values on each request to something known to be safe.

หากต้องการทราบข้อมูลเพิ่มเติม โปรดคลิกที่หมายเลขบทความต่อไปนี้เพื่อดูบทความใน Microsoft Knowledge Base::
316920You receive a "View state is invalid" error message when you use the Server.Transfer method
324488Forms authentication and view state fail intermittently under heavy load

Determine exactly what exception occurs when you receive the error message

Unfortunately, the invalid view state error message that is mentioned in the "INTRODUCTION" section of this article is not very informative. The error message is generally caused by some exception being thrown when the view state is being processed. The problem is that the exception is being consumed, and its details are lost in the error message.

By using a debugger, you can determine the original exception. To do this, you must attach a debugger to the ASP.NET process (Aspnet_wp.exe or W3wp.exe), and then set it to catch all exceptions. The debugger will probably stop at a few exceptions that are not relevant, but eventually it will hit the view state exception and provide useful information for troubleshooting.

The following steps are an example that uses the Runtime Debugger (Cordbg.exe).
  1. หน้าจอพร้อมรับคำสั่ง ทำการiisresetcommand to make sure you are provided with an good starting point, and then browse to a page on your site.
  2. At a command prompt, runcordbg.exe.
  3. ที่พรอมต์คำสั่ง พิมพ์:pro, and then press ENTER. A list of managed processes will appear. You should see either the Aspnet_wp.exe process or the W3wp.exe process. Note its PID.
  4. At the prompt, typeตัวPIDto attach to the process.

    หมายเหตุ:REPLACEPIDwith the PID that was noted in step 3.
  5. At the prompt, typeca eto tell Cordbg.exe to break on all exceptions, and then typegto let the process run.
  6. Whenever you get an exception, typewเมื่อต้องการดูกองซ้อน ถ้าเป็นกองซ้อน ยกเว้นรัฐมุมมอง (ลักษณะสำหรับ LoadPageStateFromPersistenceMedium ในกองซ้อน), คัดลอกข้อยกเว้นทั้งหมดและข้อมูลการกองซ้อนหน้าต่างคำสั่ง และจากนั้น ให้บันทึกข้อมูล ข้อมูลนี้จะช่วยให้คุณเข้าใจปัญหา ถ้าข้อยกเว้น unrelated พิมพ์g.
สำหรับข้อมูลเพิ่มเติม ให้คลิกหมายเลขบทความต่อไปนี้ เพื่อดูบทความในฐานความรู้ของ Microsoft::
831150ข้อผิดพลาด "Viewstate ไม่ถูกต้องสำหรับเพจนี้" ไม่มีข้อมูลเพียงพอในการแก้ไขปัญหา


โดยค่าเริ่มต้น การดูสถานะไม่ปัด-tripped โดยความของข้อ<input type="hidden">ฟิลด์ที่ถูกส่งไปยังเบราว์เซอร์ เบราว์เซอร์แล้วส่งฟิลด์กลับไปยังเซิร์ฟเวอร์บนคำขอถัดไป ในบางกรณี สถานะในมุมมองนี้สามารถรับองขนาดใหญ่ และเป็นแหล่งที่มาของปัญหาอาจเกิดขึ้น เบราว์เซอร์บางตัวไม่สามารถจัดการเช่นขนาดใหญ่ซ่อนเขตข้อมูล (และการร้องขอมีขนาดใหญ่ได้), และเบราว์เซอร์ที่อาจตัดทอนสถานะมุมมอง truncating สถานะในมุมมองทำให้ข้อความแสดงข้อผิดพลาด"ดูสถานะที่เสียหาย" ลักษณะการทำงานนี้เป็นส่วนใหญ่มักจะเกิดขึ้นในเบราว์เซอร์ simpler ตัวอย่างเช่น ลักษณะการทำงานนี้อาจเกิดขึ้นในเบราว์เซอร์บนการ PDA

การระบุว่า คุณอาจจะใช้เป็นปัญหาเช่น ลองเก็บสถานะมุมมองในเซสชัน ตัวอย่างต่อไปนี้อธิบายวิธีการนี้
<%@ language=c# debug=true %> 

<script runat=server> 
protected override object LoadPageStateFromPersistenceMedium() 
     return Session["_ViewState"]; 
protected override void SavePageStateToPersistenceMedium(object viewState) 
     Session["_ViewState"] = viewState; 
void TextChanged(object o, EventArgs e) 
<form runat=server> 
<asp:button text=Test runat=server/> 
<asp:textbox ontextchanged=TextChanged runat=server/> 
<input type=hidden name=__VIEWSTATE> 

จำเป็นบรรทัดต่อไปนี้ของรหัสเฉพาะสำหรับใน ASP.NET 1.0 เพื่อหลีกเลี่ยงปัญหาที่เกิดขึ้นใน ใน ASP.NET 1.1 คุณไม่จำเป็น
<input type=hidden name=__VIEWSTATE>

ตรวจสอบว่า ปัญหาที่เกิดจาก recycling กระบวนการของผู้ปฏิบัติงาน

  • คุณกำลังเรียกใช้ ASP.NET ภายใต้อินเทอร์เน็ตของ Microsoft ข้อมูล Services (IIS) 6.0
  • พูลโปรแกรมประยุกต์กำลังทำงานภายใต้ identity อื่นนอกเหนือจากบัญชี Local System บัญชีบริการเครือข่าย หรือใช้บัญชีระดับผู้ดูแลระบบ
  • กระบวนการvalidationKeyคุณลักษณะขององค์ประกอบ<machinekey>มีกำหนดองค์ประกอบเป็น AutoGenerate ในแฟ้มกำหนดค่า</machinekey>
ในสถานการณ์สมมตินี้ ขั้นตอนต่อไปนี้จะทำให้เกิดข้อผิดพลาดสถานะมุมมองจะเกิดขึ้น:
  1. ผู้ใช้ค้นหน้า
  2. กระบวนการของผู้ปฏิบัติงานที่เป็นโฮสต์ให้โปรแกรมประยุกต์ ASP.NET recycles
  3. ลงรายการผู้ใช้บัญชีกลับไปหน้า
วิธีแก้ปัญหาสำหรับสถานการณ์สมมตินี้มีการ ใช้ชัดเจนvalidationKeyแอตทริบิวต์ในแฟ้มการกำหนดค่าสำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการสร้างคีย์ คลิกหมายเลขบทความต่อไปนี้เพื่อดูบทความในฐานความรู้ของ Microsoft:
312906วิธีการสร้างคีย์ โดยใช้ Visual .NET c# สำหรับใช้ในการรับรองความถูกต้องของฟอร์ม
313091วิธีการสร้างคีย์ โดยใช้ Visual Basic .NET สำหรับใช้ในการรับรองความถูกต้องของฟอร์ม


หากต้องการทราบข้อมูลเพิ่มเติม โปรดคลิกที่หมายเลขบทความต่อไปนี้เพื่อดูบทความใน Microsoft Knowledge Base::
316920ข้อความแสดงข้อผิดพลาด "การดูสถานะไม่ถูกต้อง" เมื่อคุณใช้ Server.Transfer
324488แบบฟอร์มการรับรองความถูกต้องและการดูสถานะล้มเหลวเป็นระยะ ๆ ภายใต้การโหลดหนา
831150ข้อผิดพลาด "Viewstate ไม่ถูกต้องสำหรับเพจนี้" ไม่มีข้อมูลเพียงพอในการแก้ไขปัญหา
สำหรับข้อมูลเพิ่มเติม โปรดไปที่เว็บไซต์ต่อไปนี้ของ MSDN:


หมายเลขบทความ (Article ID): 829743 - รีวิวครั้งสุดท้าย: 14 มกราคม 2554 - Revision: 4.0
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0
kbstate kbwebforms kbinfo kbprb kbmt KB829743 KbMtth
ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ



Contact us for more help

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