【问题标题】:Azure app service windows container - Uploading file to File share using mount storage errorAzure 应用服务 Windows 容器 - 使用装载存储错误将文件上传到文件共享
【发布时间】:2021-01-31 12:40:19
【问题描述】:

我有一个简单的 .NET 4.5 mvc 应用程序,它执行简单的文件上传到目录。

此应用已容器化为 windows 容器,并作为容器部署在 Azure 应用服务 webapp 上。

它可以选择将 Azure 文件存储作为持久存储卷挂载到容器中。

所以我已经将挂载映射到上传目录。这个想法是当用户上传文件时,它会通过挂载卷进入 Azure 文件存储。

挂载成功,但尝试上传时从 system.IO 收到错误“参数不正确”。

如果我们从存储资源管理器中检查 Azure 文件存储,则会创建一个空文件。不知道出了什么问题。

2020-10-17 02:36:20,959 82924433ms INFO  FileHelper             UpLoadFile             - ToFilePath : C:\inetpub\wwwroot\FileStorage\UserProfileImages\banner-img.jpg
2020-10-17 02:36:20,975 82924449ms ERROR FileHelper             UpLoadFile             - Error in saving file. The parameter is incorrect.

2020-10-17 02:36:20,975 82924449ms ERROR FileHelper             UpLoadFile             - System.IO.IOException: The parameter is incorrect.

   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
   at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy)
   at System.IO.FileStream..ctor(String path, FileMode mode)
   at System.Web.HttpPostedFile.SaveAs(String filename)
   at ConnecTiQa.Mvc.Helpers.FileHelper.UpLoadFile(HttpPostedFileBase file, HttpServerUtilityBase server, String rename, String SaveFilePath) in C:\app\ConnecTiQa.Mvc\Helpers\FileHelper.cs:line 204

Storage account screenshot

更新 1:

不仅更新。从已安装的卷访问文件(读取)也有问题。

Mount volume file access error

【问题讨论】:

  • 这是我遇到的确切问题,我尝试过的任何方法都没有奏效......只需使用 kudu 命令控制台并进入已安装的文件共享并执行“type filename.txt”显示同样的问题“参数不正确”。如果您有任何进展,请发布。
  • 我与微软取得了联系,他们说“产品组已经确认了这个错误,他们目前正在努力解决这个问题。但是,目前还没有关于何时发布的 ETA错误将被修复。”。我已要求提供问题/票证参考,以便我可以跟踪它何时解决但尚未收到回复。所以好消息是我们可能没有做错什么,我们只是世界上仅有的两个人尝试这个!
  • 今天也在这个问题上开了一张支持票。如果我收到任何信息,我将转发此信息并报告。我可以做一个“dir”,但不能读/写任何文件。

标签: c# azure azure-web-app-service windows-container


【解决方案1】:

这太长了,不能作为评论发布。直接来自 Microsoft 支持:

Hypervisor 隔离的容器在称为 UVM(实用程序 VM)的轻量级组件中运行。当主机中的目录映射到与管理程序隔离的 Windows 容器时,Hyper-V 使用 VSMB(虚拟 SMB)将共享映射到 UVM。 VSMB 支持称为直接映射的优化,它减少了主机上用于共享的内存开销。作为支持直接映射的一部分,VSMB 必须能够查询正在访问的文件的文件 ID。因此,在这种情况下,VSMB 将查询 Azure 文件以获取文件 ID。但是,Azure 文件当前不支持从其共享中查询文件 ID,这就是产生访问共享时观察到的 ERROR_INVALID_PARAMETER 错误的原因。

这里实际上存在两个问题: Azure 文件不支持查询文件 ID。 我已经与 Azure Files 上的联系人开始了一个线程,以查看他们将来是否可以支持这一点。 当查询文件 ID 失败时,VSMB 不会回退到使用对共享的非直接映射访问 此错误存在于 19H1、20H1 和 20H2 中。在 RS5 中 VSMB 没有查询文件 ID,但在 19H1 中对此进行了更改,以使 VSMB 更正确,并消除其他错误。 20H2 之后,这个 bug 已经修复,如果文件 ID 查询失败,VSMB 将回退到非直接映射,但自从 bug 修复以来,没有新版本的 Windows Server。该修复程序将在下一个 Windows Server 版本中提供。

但是我们仍然遇到不支持查询文件 ID 并且目前没有 ETA 的 azure 文件的问题。在这种情况下,Windows 团队正在研究它,我们产品组推荐的解决方法是使用另一种机制,例如 Azure SDK for .NET 来读取/写入文件到存储

【讨论】:

  • 感谢您的更新,我的理解是现在应该解决问题。工程师发现该问题是由 Azure 应用服务用于驱动 Windows 容器的 Windows SAC 20H1 版本中引入的回归造成的。 2020 年 12 月末,应用服务推出了私有修复,几个月后将在 2021 年第一季度左右发布对 Windows 的适当修复时删除私有修复。我没有测试环境确认它正在工作。
【解决方案2】:
问题是 Windows 容器中的挂载只有权限 RX,请看这里的截图: 您在挂载点没有写入权限,因此无法将内容写入文件。

更新:

我犯了一个错误,对此我深表歉意。挂载点是您在路径映射中设置的路径。比如你设置挂载路径为/inetpub/wwwroot/filestorage/mnt,那么挂载点就是最后一个文件夹mnt,那么里面的所有动作都是错误的:

我不确定这是否是问题,但我猜是问题所在。

【讨论】:

  • 感谢您的意见。但我也有阅读问题。用详细信息更新了我的问题
  • /inetpub/wwwroot/filestorage/ 这是我的挂载点。如果键入 dir,可以看到所有现有文件列表。但不能读或写。
  • @Singaravelan 是的,没错。你可以看到所有这些,但你不能对它们做任何事情。那就是问题所在。 Linux容器没有这个问题。
  • @CharlesXu 你能再扩展一点吗 - 我遇到了同样的问题... Windows 容器,带有 Azure Files SMB 文件共享,我的应用程序可以查看文件共享文件夹和其中的文件它,但无法读取内容或写入内容。您是否建议完成了不正确的 Azure 存储挂载,如果是,您能否提供一个如何正确完成的示例? Singara velan 如果你让它工作,请发布(绝对是权限问题,但试图找出原因)。
  • @CharlesXu RobertShattock,我们已升级为 Microsoft 合作伙伴之一,将会看到任何解决方法。
猜你喜欢
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
  • 2018-08-09
  • 2012-04-15
  • 2020-07-15
  • 2021-03-09
  • 1970-01-01
  • 2020-09-26
相关资源
最近更新 更多