监视我的全局异常日志这个错误似乎无法删除,无论我做什么,我以为我终于摆脱它但它又回来了.您可以在此处查看类似帖子上的错误痕迹.
关于环境的说明:
IIS 6.0,.NET 3.5 SP1 单服务器 ASP.NET应用程序
已采取的步骤:
在我的所有页面的页面基础中
protected override void OnInit(EventArgs e) { const string viewStateKey = "big key value"; Page.ViewStateUserKey = viewStateKey; }
同样在页面的源代码中,我可以看到所有ASP.NET生成的隐藏字段都正确地位于页面顶部.
首先让我们从事实开始,这个视图状态错误发生在PostBack上.
另外,我必须说我已经完成了每个人建议做的所有事情来避免这个问题.我有一台机器,但有两个运行相同Pages的池.
所以有人通过"点击"你的页面来做一个动作,一个人,一个其他搜索机器,或者一些黑客试图检查你的系统是否有问题......
我有类似的问题(罕见但现有的),我终于发现人们试图破解测试我的页面.(来自我所拥有的相同IP和dos攻击)
我修改了翻译视图状态的函数LoadPageStateFromPersistenceMedium(),并通过记录输入的确切内容以及从哪些IP ...然后我开始监视这些结果并看到视图状态是手动更改 - 或者是完全为空.
出错时我只是将他重定向到同一页面......
这就是我做的......
public abstract class BasePage : System.Web.UI.Page { protected override object LoadPageStateFromPersistenceMedium() { try { .. return the base, or make here your decompress, or what ever... return base.LoadPageStateFromPersistenceMedium(); } catch (Exception x) { string vsString = Request.Form[__VIEWSTATE]; string cThePage = Request.RawUrl; ...log the x.ToString() error... ...log the vsString... ...log the ip coming from... ...log the cThePage... // check by your self for local errors Debug.Fail("Fail to load view state ! Reason:" + x.ToString()); } // if reach here, then have fail, so I reload the page - maybe here you // can place somthing like ?rnd=RandomNumber&ErrorId=1 and show a message Responce.Redirect(Request.RawUrl, true); // the return is not used after the redirect return string.Empty; } }
现在还有一个原因可以解决这个问题,原因是因为在加载__EVENTVALIDATION之前有一次点击页面.
这个eventValidation放在最后一个按钮上 - 甚至是asp.net找到的,如果你在页面上的许多地方或按钮附近有一些它们,那么这将转到页面的末尾.
因此,即使您在页面顶部看到视图状态,验证位置在哪里?也许这从未加载 - 页面损坏?用户点击页面太快?
为了避免这种问题,我做了一个简单的javascript我不会让它按下按钮,除非这个输入已被加载!!!
还有一条评论,__ EVENTVALIDATION并不总是存在!如果你做一般解决方案,那么可能更安全的不是搜索这个字段,而是制作一个javascript技巧来检查是否加载了整个页面,或者你认为的其他内容.
这是我对jQuery的最终解决方案:(注意我检查PageLoad是否存在eventvalidation!).我将它放在我的MasterPages上.
protected void Page_Load(object sender, EventArgs e) { // I do not know if Page can be null - just in case I place it. if (Page != null && Page.EnableEventValidation) { Form.Attributes["onsubmit"] = "return AllowFormToRun();"; } }
您可以通过在页面按钮附近延迟进行测试.
<% System.Threading.Thread.Sleep(5000); %>
今天我再次在日志中看到WebResource的这条消息,我发现机器人获取页面并以小写形式在链接上创建所有字符,包括参数,所以这是获得正确编码字符串的另一个原因,并抛出像Padding这样的消息是无效的,无法删除.
希望这能帮到你更多.