Mojarra JSF 2的实现具有以下上下文参数:
com.sun.faces.numberOfViewsInSession (默认为15)com.sun.faces.numberOfLogicalViews (默认为15)他们之间有什么区别?文档中没有提到这些内容.我的应用程序在ViewExpiredException某些页面遇到问题,但在我们将这些设置提高到(更高)值后,我们就停止了问题.
我的应用程序是一个财务,重量级,支持Ajax的应用程序(有些屏幕有50多个输入,可以选择通过AJAX添加更多数据/输入).
这种行为可能是什么原因?我知道第一个参数定义了会话中保存的"页面"的数量,这对于后退按钮可能很有用,但我触发的用例ViewExpiredException不使用后退按钮.第二个参数是指什么?如果我保持在同一个屏幕但通过AJAX继续添加大量数据,这是否会导致需要更多的逻辑视图用于页面?
我在asp.net网站上的某些时候收到以下错误.
Sys.WebForms.PageRequestManagerServerErrorException:
Validation of viewstate MAC failed.
If this application is hosted by a Web Farm or cluster,
ensure that <machineKey> configuration specifies the
same validationKey and validation algorithm.
AutoGenerate cannot be used in a cluster.
Run Code Online (Sandbox Code Playgroud)
当页面刷新时,没问题.我怎样才能解决这个问题?
我有一个ASP.NET 2.0应用程序,在我们的本地环境中工作正常.发布到测试服务器时,我们在服务器上出现间歇性错误.
这是最常见的:
填充无效,无法删除.描述:执行当前Web请求期间发生未处理的异常.请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息.
异常详细信息:System.Security.Cryptography.CryptographicException: 填充无效,无法删除.
来源错误:
在执行当前Web请求期间生成了未处理的异常.可以使用下面的异常堆栈跟踪来识别有关异常的起源和位置的信息.
堆栈跟踪:
[CryptographicException:填充无效,无法删除.]
System.Security.Cryptography.RijndaelManagedTransform.DecryptData(Byte [] inputBuffer,Int32 inputOffset,Int32 inputCount,Byte []&outputBuffer,Int32 outputOffset,PaddingMode paddingMode,Boolean fLast)+1545747
System.Security.Cryptography.RijndaelManagedTransform.TransformFinalBlock(Byte [] inputBuffer,Int32 inputOffset,Int32 inputCount)+257
System.Security.Cryptography.CryptoStream.FlushFinalBlock()+30 System.Web.Configuration.MachineKeySection.EncryptOrDecryptData(Boolean fEncrypt,Byte [] buf,Byte []修饰符,Int32 start,Int32 length,Boolean useValidationSymAlgo)+164
System.Web.UI.Page.DecryptString(String s)+83
System.Web.Handlers.AssemblyResourceLoader.System.Web.IHttpHandler.ProcessRequest(HttpContext context)+148
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()+358 System.Web.HttpApplication.ExecuteStep(IExecutionStep step ,Boolean&completedSynchronously)+64
这发生在对特定WebResource.axd请求的请求上.
我们看到的另一个错误是:
验证视图状态MAC失败.如果此应用程序由Web场或群集托管,请确保配置指定相同的validationKey和验证算法.AutoGenerate不能在群集中使用.描述:执行当前Web请求期间发生未处理的异常.请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息.
异常详细信息:System.Web.HttpException:viewstate MAC验证失败.如果此应用程序由Web场或群集托管,请确保配置指定相同的validationKey和验证算法.AutoGenerate不能在群集中使用.
发布表单时偶尔会发生此错误.
在你跳入并告诉我这个错误的明显(通常)答案之前,请考虑一下:
aspnet_regiss -ga <username>在服务器上运行.没有效果.我正在学习ASP.NET MVC,许多"ASP.NET"概念,如身份验证,授权,会话状态仍然适用于它.
但是从我所理解的一点点来看,我都没有看到ViewState在ASP.NET应用程序中仍然具有相关性.但它存在(System.Web.Mvc.ViewPage的属性)!是仅出于兼容性原因还是有一些目的/用途?
我在ASP.NET内容表单上有一个CheckBox,如下所示:
<asp:CheckBox runat="server" ID="chkTest" AutoPostBack="true" OnCheckedChanged="chkTest_CheckedChanged" />
Run Code Online (Sandbox Code Playgroud)
在我的代码后面我有以下方法:
protected void chkTest_CheckedChanged(object sender, EventArgs e)
{
}
Run Code Online (Sandbox Code Playgroud)
当我在浏览器中加载页面并单击CheckBox时,它会被检查,页面会回发,我可以看到chkTest_CheckedChanged被调用.
然后,当我再次单击CheckBox时,它将取消选中,页面会回发,但chkTest_CheckedChanged不会被调用.
该过程是可重复的,因此一旦取消选中CheckBox,检查它将触发事件.
我在Web.Config中禁用了View State,启用View State会导致此问题消失.在View State保持禁用状态时,我可以做些什么才能获得可靠的事件?
更新:
如果我Checked="true"在服务器标签上设置,当取消选中CheckBox时事件触发,情况就会反转,而不是相反.
更新2:
我已经OnLoadComplete在我的页面中覆盖了,并且从那里我可以确认Request.Form["__EVENTTARGET"]已正确设置我的CheckBox的ID.
我知道它会在Load之前的某个时间发生,但在什么事件中呢?
我真的很困惑片段的内部状态.如果另一个Fragment应该显示,我有一个Activity只能同时保存一个Fragment并替换它.如果onSaveInstanceState调用Activitys (在我的情况下不调用),则仅调用docs onSaveInstanceState.
如果我停止我的片段,我会将自己的状态存储在一个单身人士中(是的,我知道我也讨厌单身人士,但这不是我的想法).所以我必须重新创建整个ViewHirarchy,创建新的视图(通过使用关键字new),恢复其状态并将其返回onCreateView.我也有这种说法,从我做明确里面一个复选框不希望存储的状态.
然而,FragmentManager想要"智能"并且onViewStateRestored使用Bundle 调用我从未创建过自己,并"恢复"旧状态CheckBox并将其应用于我的新CheckBox.这引发了很多问题:
我可以控制捆绑onViewStateRestored吗?
FragmentManager如何获取(可能是垃圾收集的)CheckBox的状态并将其应用于新的CheckBox?
为什么它只保存Checkbox的状态(不是TextViews ??)
总结一下:onViewStateRestored工作怎么样?
注意我正在使用Fragmentv4,因此不需要API> 17 onViewStateRestored
假设您有一个不依赖于会话的aspx页面,但依赖于viewstate来表示回发之间的持久性.
如果用户正在访问此页面并离开长时间的午餐,那么当他返回时,viewstate仍然有效吗?
我发现在用户控件中保留属性值的唯一方法是使用ViewState.
public string Title {
get { return Convert.ToString(ViewState["Title"]); }
set { ViewState["Title"] = value; }
}
Run Code Online (Sandbox Code Playgroud)
我不能说我对此印象非常深刻,因为用户控件的属性越多,你就越容易陷入ViewState.是否有更好的方法来坚持物业?
我试图打开viewstate加密始终作为IIS6中托管的ASP.NET 3.5网站的安全措施.我们关闭了viewstate,但仍然在此字符串中看到一些"controlstate".在测试环境中,我只需在web.config中设置以下内容,我就不能再将basest解码为viewstate为半明文:
<pages enableViewState="false" enableViewStateMac="true" viewStateEncryptionMode="Always">
我甚至将以下内容(由机器密钥生成器生成)添加到machine.config并仍然在我的测试服务器上加密viewstate:
<machineKey validationKey="002..." decryptionKey="D90E..." validation="SHA1" decryption="AES" />
我的非测试环境似乎没有获得上述更改,因为我始终可以使用上述设置将viewstate解码为纯文本.在做出任何改变之后,我总是感到不安.
有关我的非测试网络服务器的一些信息:
任何人都可以建议在哪里寻找可能会干扰asp.net viewstate加密的其他设置?
编辑:现在在我的iis测试服务器上我无法撤消viewStateEncryptionMode设置,因为它正在加密视图状态,即使我将其设置为"从不"并且我的其他网站似乎都没有抓住此设置.我在哪里可以看到这个属性被覆盖的地方?是否存在需要清除此设置的缓存,除了iisreset/stop www service/touch machine.config时要执行的操作?
编辑决赛:经过几天研究配置文件后,我放弃并通过代码实现了这一点.我已经有一个附加到页面事件的安全模块,所以在Page_Load中我添加了:Page.RegisterRequiresViewStateEncryption();
我真的很想知道是什么阻止了这个设置被IIS6 immediatley选中.当我在本地运行cassini时,如果我通过pages节点将viewStateEncryptionMode设置为"Always",我会立即看到它对viewstate进行编码并使用id ="__ VIEWSTATEENCRYPTED"渲染其他隐藏字段.当我将其设置为"从不"时,我会立即看到加密关闭.如果我对我的IIS6托管网站上的网站进行了相同的更改,它将立即生效,但如果我允许设置保留在那里,它最终会占用.我会停止/启动www服务,重置iis,清除ASPNET临时缓存,但我不知道还有什么可以尝试?希望这篇文章可以ROT一段时间,将来有人会看到我所经历的相同行为,我们可以进一步弄清楚这一点!
viewstate ×10
asp.net ×8
machinekey ×2
.net ×1
android ×1
asp.net-mvc ×1
base64 ×1
encryption ×1
fragment ×1
jsf ×1
jsf-2 ×1
mojarra ×1
properties ×1
restore ×1
webforms ×1