TL / DR:我们有一个Windows Universal Application,它使用StorageFile类与本地存储的JSON数据进行交互。使用该应用程序一天后,用户获得UnauthorizedAccessException并且数据消失。
长版本:我们有一个Windows通用应用程序,它从API检索数据并将本地数据保存到ApplicationData.Current.LocalFolder中的JSON文件,以便用户可以脱机工作。通常在一天开始时检索数据,并在一天结束时将数据发送回API。当记录成功发送回API时,它将从本地JSON中删除。使用UI中的按钮手动触发与API的整个同步过程。此工作流还限制了应用程序和API之间发送的数据量,并防止本地文件无休止地增长。
我们使用StorageFile类将数据加载到内存中的集合中,以使用Newtonsoft JsonConvert对象读取JSON文件的内容并将它们转换为我们的模型对象。直到最近,当用户开始报告数据正在消失时,所有这一切都顺利地进行了一段时间。查看应用程序的日志文件,我们看到弹出一个一致的错误:
'Exception when reading file "<filename>" from storage: System.UnauthorizedAccessException: Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at HQSTouch.Infrastructure.StorageManager.<ReadFromStorageAysnc>d__2.MoveNext()'
我们可能会在阅读文件或写入文件时看到此错误。至少从最终用户的角度来看,这些错误的不幸结果是数据消失了。这通常发生在用户在一天中的大部分时间使用应用程序之后,完成他们的工作说出15条记录中的10条。在我的测试中,我看到JSON文件大小从<50Kb跳到高达几百Kb,这似乎并不过分。
现在,当数据消失时,它并不会全部消失。在文件访问错误之后,如果用户仍在处理记录,因此它在内存中,那么一条记录最终成为本地JSON文件中的唯一记录。将数据保存到本地文件时,我们将文件中的数据加载到集合中,合并到修改后的记录中,然后序列化并将其全部写回JSON文件,替换文件的内容。
非常感谢任何帮助。感谢。
编辑:虽然这可能类似于How to handle concurrency with StorageFile operations?中发布的问题,但我们对异步/等待操作一直持谨慎态度,尤其是在与文件系统交互时。快速扫描代码堆栈表明我们的方法返回一个Task并等待着。我觉得我们的情况与该线程中讨论的内容不同。特别是对于一个用户来说,这个问题刚刚在最新一轮的Windows更新之后开始发生。在Windows更新之前,他们已经使用该应用程序一段时间没有任何问题。那段时间我们的应用没有任何更新。