在最近的负载测试中,我得到了一些奇怪的“索引超出范围异常”
堆栈追踪:
at System.Security.Cryptography.RijndaelManagedTransform.DecryptData(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount, Byte[]& outputBuffer, Int32 outputOffset, PaddingMode paddingMode, Boolean fLast)
at System.Security.Cryptography.RijndaelManagedTransform.TransformFinalBlock(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount)
at System.Security.Cryptography.CryptoStream.FlushFinalBlock()
at System.Web.Configuration.MachineKeySection.EncryptOrDecryptData(Boolean fEncrypt, Byte[] buf, Byte[] modifier, Int32 start, Int32 length, Boolean useValidationSymAlgo)
at System.Web.UI.Page.DecryptString(String s)
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
我们没有使用服务器场或群集,我没有在应用程序中使用任何加密技术。
这似乎发生在幕后.Net类。
我认为这与viewstate有关,但我无法找出为什么会抛出它。
任何想法?
答案 0 :(得分:1)
如果有人发起帖子,则应用程序开始发送包含所有500KB viewstate的帖子。在回发的一半时,用户会感到无聊并点击其他内容。浏览器仅使用viewstate的一部分来切断回发。服务器抛出一个错误,指出视图状态是borked。我猜这是一个打开了viewstate加密功能的2.0应用程序。解决方案是更积极地管理视图状态大小。
当恶意用户制作自定义回发响应时,更有可能发生事件验证异常,因此我认为此处不涉及事件验证。
答案 1 :(得分:0)
猜测一下:您是否在网站上禁用了EventValidation?听起来有些事情是试图创建手动回发或以其他方式直接将数据插入到http请求的帖子数据中,并且没有为viewstate字段计算正确的值。这反过来导致解密失败。
启用EventValidation即使他们正确计算了所有内容,你也会得到异常,但至少这是一个有意义的例外。