Silverlight IsolatedStorageFile.IncreaseQuotaTo
本文关键字:IncreaseQuotaTo IsolatedStorageFile Silverlight | 更新日期: 2023-09-27 17:56:34
Msdn doc for IsolatedStorageFile.IncreaseQuotaTo
指出:
要增加配额,您必须调用 此方法来自用户启动 事件,例如在 的事件处理程序中 按钮单击事件。当您致电时 IncreaseQuotaTo 方法,常见的 Silverlight 中的语言运行时 显示一个对话框供用户 批准请求。如果用户 拒绝请求,此方法 返回 false 且配额保持不变 大小相同。
Silverlight 如何知道该方法是从用户启动的事件(如按钮单击)调用的,而不是从其他线程调用的?
更具体地说:什么是用户发起的事件?有没有办法克服这个限制?
还有一个问题:
当用户第一次访问我的应用程序时,我会自动下载文件,但我不希望用户按"下载",然后当我检测到需要更多空间时,调用 IncreaseQuota 并出现"Silverlight 对话框"要求更多空间。
我想自动开始下载(不是用户启动的),如果我检测到需要更多空间,请调用 IncreaseQuota,从而出现"Silverlight 对话框"。(没有用户按下载)。
经过大量挖掘,我确实发现了用户发起的事件是什么。似乎 msdn doc 在与"事件概述"相关的部分中指定了用户启动的事件,但 IsolatedStorageFile.IncreaseQuotaTo 的文档与事件概述之间没有链接
因此,根据定义,用户发起的事件是:
Silverlight强制执行某些仅允许在处理用户启动的事件。以下是此类操作的列表:
设置为全屏。
显示某些对话框。这包括SaveFileDialog、OpenFileDialog和打印对话框由打印文档.打印.
从超链接按钮导航。
访问主剪贴板 API。
Silverlight 用户发起的事件包括鼠标事件(例如鼠标左键向下)和键盘事件(如按键)。大事记基于此类事件的控件(如点击)也考虑在内用户启动。
需要用户启动的 API 调用应尽快致电在事件处理程序中。这是因为Silverlight 用户启动概念还要求调用在特定时间窗口内发生事件发生后。在银光4,这个时间窗口是大约一秒钟。
用户启动的事件限制适用于 JavaScript API 的用法银光。
当 Silverlight 处于全屏状态时模式,一些输入事件是为了安全起见,故意限制原因,尽管这可能是针对浏览器外问题进行了缓解使用提升的信任的应用程序。为有关详细信息,请参阅全屏支持。
虽然我在"操作"列表中没有看到"IncreaseQuotaTo",但我猜他们只是忘记了它,因为行为/限制与文档中描述的行为/限制相同。
我很好奇 silverlight 究竟如何知道用户发起的事件是什么,但在挖掘 .net 框架源代码后,我陷入了死胡同:
if ((browserService == null) || !browserService.InPrivateMode())
{
//..
}
return false; //means that IncreaseQuota will fail
其中浏览器。IsInPrivateMode 是:
[SecuritySafeCritical]
public bool InPrivateMode()
{
bool privateMode = false;
return (NativeMethods.SUCCEEDED(UnsafeNativeMethods.DOM_InPrivateMode(this._browserServiceHandle, out privateMode)) && privateMode);
}
其中DOM_InPrivateMode在DllImport["agcore"]中,根据微软的说法,这是机密:(所以看起来我不会很快发现他们如何检测用户发起的事件。
仔细想想,我想微软不希望用户在浏览器中打开许多选项卡,然后噗:我自动调用IncreaseQuotaTo。
IncreaseQuotaTo 是一个浏览器模式对话框。这意味着您无法在处于活动状态时导航到其他浏览器选项卡。因此,如果用户现在已从我的页面移动到带有 google.com 的选项卡,并且如果我能够延迟调用 IncreaseQuotaTo,则用户可能会认为 google.com 要求更多存储:)。
这确实是一个安全漏洞。
如果他们使用页面级对话框实现了这一点,那么这可能更容易被黑客入侵(或变通)。
总而言之,想到这一点,我开始明白为什么他们像这样实现它以及为什么存在这些限制。
文档并非不完整。
如果我这样做...
button_click(..) { new UserControl() }
......这是否仍算作用户发起的事件?
是的。但是,这点额外的代码真正实现了什么?
我个人从未尝试过的正是构成用户事件的内容;IOW 鼠标悬停是否被视为用户事件?这对您来说非常简单,您可以尝试许多其他事情。如有必要,您可以弹出一个欢迎用户的初始屏幕,他们必须单击它才能关闭它,此时您发出请求。这可能看起来有点老套,但如果你表现得好,你可以侥幸逃脱这样的事情。
请注意,提示是一次性的。如果提示用户并且他们接受,则会在两次访问之间为应用程序保留该存储,这意味着下次他们使用您的控件时无需再次提示他们,则配额仍会比上次增加(除非用户有意删除了它,他们可以通过右键单击 Silverlight 控件,然后转到"应用程序存储"选项卡来执行此操作)。