.net 应用程序无法访问Azure存储帐户文件

.net 应用程序无法访问Azure存储帐户文件,.net,azure,.net,Azure,在Azure windows VM上添加网络驱动器,例如net use T:\.file.core.windows.net\等,或通过power shell命令,可以在power shell中工作并访问文件、拖放等,但在VM上运行的应用程序(即使在同一用户下)无法读取文件。“无法打开文件…DirectoryNotFoundException-找不到路径的一部分…”。发生了什么事?而且它在我的开发机器上本地工作。据我所知,如果您在VM中装载文件共享,您可以在虚拟机中运行代码,使用标准Windows

在Azure windows VM上添加网络驱动器,例如net use T:\.file.core.windows.net\等,或通过power shell命令,可以在power shell中工作并访问文件、拖放等,但在VM上运行的应用程序(即使在同一用户下)无法读取文件。“无法打开文件…DirectoryNotFoundException-找不到路径的一部分…”。发生了什么事?而且它在我的开发机器上本地工作。

据我所知,如果您在VM中装载文件共享,您可以在虚拟机中运行代码,使用标准Windows文件I/O API(如.NET Framework中System.IO命名空间提供的API)访问文件共享

根据您的错误消息,我猜您的应用程序的文件路径可能有问题。 我建议您可以检查应用程序的文件路径,然后重试

此外,我建议您可以使用Azure文件共享SDK直接访问该文件

通过使用这种方式,您可以访问该文件,而无需在VM中装载文件共享

这里有一个小演示,希望能给你一些提示:

您可以使用VS中的nugget软件包管理器安装Azure存储SDK

CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
                     "connection string");

            // Create a CloudFileClient object for credentialed access to File storage.
            CloudFileClient fileClient = storageAccount.CreateCloudFileClient();

            // Get a reference to the file share we created previously.
            CloudFileShare share = fileClient.GetShareReference("brandofirstsharetest");

            // Ensure that the share exists.
            if (share.Exists())
            {
                // Get a reference to the root directory for the share.
                CloudFileDirectory rootDir = share.GetRootDirectoryReference();

                // Get a reference to the directory we created previously.
                CloudFileDirectory sampleDir = rootDir.GetDirectoryReference("BrandoTestDirectory");

                // Ensure that the directory exists.
                if (sampleDir.Exists())
                {
                    // Get a reference to the file we created previously.
                    CloudFile file = sampleDir.GetFileReference("test2.txt");

                    // Ensure that the file exists.
                    if (file.Exists())
                    {
                        // Write the contents of the file to the console window.
                        Console.WriteLine(file.DownloadTextAsync().Result);
                    }
                }
            }
            Console.ReadLine(); 

你是如何装载Azure文件共享的?使用什么帐户?可能导致您出现问题的原因是,凭据仅对特定上下文有效,上下文是正在使用的凭据以及它们的身份验证方式

例如,如果您在非管理模式下从命令行窗口装载Azure文件共享,则您使用的帐户将能够在非管理模式下访问该文件共享。如果您以其他用户身份登录,您将无法再访问该文件共享,因为它与您以前使用的用户不同。如果在管理模式下打开命令行窗口并尝试访问文件共享,您将无法访问,因为管理模式和非管理模式是两种不同的上下文

您必须使用将要使用该驱动器的帐户装载该驱动器。几年前,我尝试在windows服务中装载和使用文件共享,发现我无法在windows服务使用的帐户下设置凭据,即使我尝试在特定帐户而不是系统帐户下运行windows服务,因为作为服务运行显然是另一种上下文


如果无法使用与正在使用的驱动器相同的上下文装入驱动器,则可以通过编程方式装入驱动器。Azure存储团队关于的一篇原始博客文章中有关于此的示例代码。这就是我最终使windows服务成功运行的原因。

请尝试解决此问题,因为该卷是由运行应用程序的同一用户装载的,或者是以管理员身份运行PowerShell的同一用户装载的。可能相关,也可能无关。其中一个应用程序是在.NET4.6下构建的,其中4.6.2可能对Azure更友好。我知道这并不是一个太长的路径,而且我确信路径中并没有奇怪的字符。我最后添加了一个磁盘,并将其作为我的T:drive挂载,这很有效。所以还是有问题。这可能与运行Windows Server 2012而不是Server 2016的VM有关。另外,我不是在找工作。这项技术应该可以正常工作。更新,一个运行2012年的VM和一个运行2016年的VM,每个都有相同的问题。我已经在VM2012上编写了一个测试演示,我可以使用system.io类直接访问。确保使用正确的用户帐户访问装载的文件磁盘。