无法从我的.Net代码读取/写入Azure文件共享

时间:2017-10-12 00:23:29

标签: vb.net azure azure-storage mapped-drive

我编写了一个在Azure Windows Server 2016 VM中运行的服务。当它从队列中获取作业时,它会生成另一个生成PDF并将其保存到磁盘的程序。我正在使用streamreader / streamwriter读取配置文件并将HTML文件(使用第三方组件转换为PDF)保存到磁盘。

但是,对于Azure文件SMB共享的所有磁盘访问,我一直无法获得路径无法找到版本的错误。如果我使用本地磁盘它工作正常。

我已经仔细检查过它正在使用正确的路径并且路径实际存在(简单地说是P :)。

多年来,在共同定位的应用服务器上运行良好。我正试图将所有内容移动到Azure。

任何想法我错过了什么或做错了什么?

编辑:

看起来我遇到了这个问题:https://serverfault.com/questions/177139/windows-service-cant-access-network-share

但我无法在此处执行相同的解决方案,因为使用Azure文件时,我无法添加用户的远程服务器。

MSDN论坛用户建议使用Azure Storage Client Library。我的第三方PDF组件无法重新编程以使用Azure客户端存储库,因此我将在本地驱动器上完成所有工作,然后将最终的PDF文件复制到Azure文件。

这将是一个完全可以接受的解决方案。但是我不知道如何把它拉下来。

1 个答案:

答案 0 :(得分:0)

您无法对从服务中生成的服务或程序执行Azure文件SMB共享的“正常”文件访问。您可以通过编程方式将文件复制到存储帐户或从存储帐户复制到本地驱动器。您必须使用本地驱动器来创建和编辑文件,然后将这些文件复制回存储帐户。

以下是一些将本地文件复制到Azure文件共享的VB.Net代码(有效,但未清理):

Imports Microsoft.WindowsAzure.Storage
Imports Microsoft.WindowsAzure.Storage.File
Imports System.Configuration

    Dim StorageAccount As CloudStorageAccount
    Dim file As FileInfo
    Dim fileClient As CloudFileClient
    Dim share As CloudFileShare
    Dim root As CloudFileDirectory
    Dim dir As CloudFileDirectory
    Dim cloudFile As CloudFile

    Try
        file = New FileInfo(InFileName) ' includes full path to file
        StorageAccount = CloudStorageAccount.Parse(ConfigurationManager.AppSettings.Get("AzureFilesConnString"))

        fileClient = StorageAccount.CreateCloudFileClient()
        share = fileClient.GetShareReference("sharename")
        root = share.GetRootDirectoryReference()
        dir = root.GetDirectoryReference("PDFs") ' Note that you apparently can't copy to the root (\) folder 

        cloudFile = dir.GetFileReference(OutFileName) ' Only the file name, not full URI

        Using fs As FileStream = file.OpenRead()
            cloudFile.UploadFromStream(fs)
        End Using
    Catch ex As StorageException
        Debug.Print(ex.Message)
        Debug.Print(ex.RequestInformation.Exception.ToString)
    Catch ex As Exception
        Debug.Print(ex.Message)
    End Try