我正在尝试构建一个非常非常简单的"微网络应用程序",如果我完成它,我怀疑它会引起一些Stack Overflow的兴趣.我在深度站点的C#中托管它,这是vanilla ASP.NET 3.5(即不是MVC).
流程非常简单:
以下是我的自我要求(设计和实施的混合):
大多数情况都没问题,但我没有找到任何完全删除视图状态并保留其余有用功能的方法.使用此博客文章中的帖子,我设法避免获得视图状态的任何实际值 - 但它仍然最终作为URL上的参数,看起来非常难看.
如果我使它成为一个简单的HTML表单而不是ASP.NET表单(即取出runat="server"),那么我没有得到任何魔术视图状态 - 但后来我无法以编程方式访问控件.
我可以通过忽略大部分ASP.NET并使用LINQ to XML构建XML文档并实现来完成所有这些工作IHttpHandler.虽然感觉有点低.
我意识到我的问题可以通过放宽我的约束(例如使用POST而不关心剩余参数)或使用ASP.NET MVC来解决,但我的要求真的不合理吗?
也许ASP.NET只是不缩小到这种应用程序?虽然有一个非常可能的替代方案:我只是愚蠢,并且有一个非常简单的方法,我只是没有找到.
任何想法,任何人?(提示评论强大如何堕落等等.那很好 - 我希望我从未声称自己是一名ASP.NET专家,因为事实恰恰相反......)
ASP.NET中的SessionState和ViewState有什么区别?
我没有什么可以继续下去的.我无法在本地重现,但当用户收到错误时,我会收到一封自动电子邮件异常通知:
Invalid length for a Base-64 char array.
at System.Convert.FromBase64String(String s)
at System.Web.UI.ObjectStateFormatter.Deserialize(String inputString)
at System.Web.UI.ObjectStateFormatter.System.Web.UI.IStateFormatter.Deserialize(String serializedState)
at System.Web.UI.Util.DeserializeWithAssert(IStateFormatter formatter, String serializedState)
at System.Web.UI.HiddenFieldPageStatePersister.Load()
Run Code Online (Sandbox Code Playgroud)
我倾向于认为分配给viewstate的数据存在问题. 例如:
List<int> SelectedActionIDList = GetSelectedActionIDList();
ViewState["_SelectedActionIDList"] = SelectedActionIDList;
Run Code Online (Sandbox Code Playgroud)
如果不能在本地重现错误,很难猜出错误的来源.
如果有人对此错误有任何经验,我真的很想知道你发现了什么.
正如标题所说,我得到:
Base-64 char数组的长度无效.
我已经在这里阅读了这个问题,似乎建议将ViewState存储在SQL中,如果它很大的话.我正在使用一个带有大量数据收集的向导,所以我的ViewState很可能很大.但是,在我转向"存储在数据库"解决方案之前,也许有人可以看看并告诉我是否有其他选择?
我使用以下方法构建了用于传递的电子邮件:
public void SendEmailAddressVerificationEmail(string userName, string to)
{
string msg = "Please click on the link below or paste it into a browser to verify your email account.<BR><BR>" +
"<a href=\"" + _configuration.RootURL + "Accounts/VerifyEmail.aspx?a=" +
userName.Encrypt("verify") + "\">" +
_configuration.RootURL + "Accounts/VerifyEmail.aspx?a=" +
userName.Encrypt("verify") + "</a>";
SendEmail(to, "", "", "Account created! Email verification required.", msg);
}
Run Code Online (Sandbox Code Playgroud)
Encrypt方法如下所示:
public static string Encrypt(string clearText, string Password)
{
byte[] clearBytes = System.Text.Encoding.Unicode.GetBytes(clearText);
PasswordDeriveBytes pdb = new PasswordDeriveBytes(Password, new …Run Code Online (Sandbox Code Playgroud) 在Session和Cache中存储数据表有什么区别?有哪些优点和缺点?
因此,如果它是一个简单的搜索页面,它返回数据表中的结果并将其绑定到gridview.如果用户'a'搜索并且用户'b'搜索,是否最好将其存储在Session中,因为每个用户很可能会有不同的结果,或者我仍然可以将他们的每个搜索存储在缓存中,或者这是否有意义,因为有只有一个缓存.我想基本上我想说的是Cache会被覆盖.
我似乎偶尔会在ASP.NET应用程序的事件查看器中获得"无效的视图状态" .
他们中的大多数(95%)似乎是引用ScriptResource.axd(该应用程序使用ASP.NET AJAX库).我无法删除Ajax库,因为到处都使用Ajax.
如何减少这些错误?我每天得到约100-200个错误,我不知道如何修复它们!它们来自不同的浏览器,不同的IP和地理位置.
我很难重现这个问题,因为它几乎没有发生在我身上,它只发生在我身上3-4次.
错误:
Process information:
Process ID: 4004
Process name: w3wp.exe
Account name: NT AUTHORITY\NETWORK SERVICE
Exception information:
Exception type: HttpException
Exception message: Invalid viewstate.
Request information:
Request URL: http://domainnamehere/ScriptResource.axd?d=W1R6x9VzZ2C9SKnIkOmX9VRLhSjJ3nOF1GSQvPwKS3html
Request path: /ScriptResource.axd
User host address: 124.177.170.75
User:
Is authenticated: False
Authentication Type:
Thread account name: NT AUTHORITY\NETWORK SERVICE
Thread information:
Thread ID: 1
Thread account name: NT AUTHORITY\NETWORK SERVICE
Is impersonating: False
Stack trace: at System.Web.UI.Page.DecryptStringWithIV(String s, …Run Code Online (Sandbox Code Playgroud) 我需要查看asp.net页面的viewstate的内容.我查找了一个视图状态解码器,找到了Fridz Onion的ViewState Decoder,但它要求页面的url获取其viewstate.由于我的视图状态是在回发后形成的,并且是由于更新面板中的操作而导致的,因此我无法提供网址.我需要复制并粘贴viewstate字符串,看看里面是什么.是否存在可以帮助查看viewstate内容的工具或网站?
每隔一段时间(每天一次)我们在ASP.NET 3.5应用程序的日志中看到以下类型的错误
这些东西是否只是偶尔发生在ASP.NET应用程序中?有人会建议我们花很多时间来诊断导致问题的原因吗?
我只是想将WebForms转换为MVC:
在.net MVC中,哪些概念使ViewState成为不需要的东西?
如果表格在iteself上回发等(即回发)?page/usercontrol如何保持其状态?
人们在维持某种状态而不采用会话状态方面有什么技巧?
当然,完全无国籍的环境不存在?
有人可以解释一下ViewState和Session之间的区别吗?
更具体地说,我想知道在我的页面的整个生命周期中保持对象可用的最佳方法(通过回发连续设置成员).
我目前使用Sessions来做这件事,但我不确定这是不是最好的方法.
例如:
SearchObject searchObject;
protected void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack)
{
searchObject = new SearchObject();
Session["searchObject"] = searchObject;
}
else
{
searchObject = (SearchObject)Session["searchObject"];
}
}
Run Code Online (Sandbox Code Playgroud)
这允许我在我的页面上的任何其他地方使用我的searchObject,但它有点麻烦,因为我必须重置我的会话变量,如果我改变任何属性等.
我认为必须有一个更好的方法来实现这一点,以便.NET不会在每次加载页面时重新实例化对象,而且还将它放在Page类的全局范围内?