我编写了一个在Azure Windows Server 2016虚拟机中运行的服务。当它从队列中获得作业时,它会生成另一个程序,该程序会生成PDF并将其保存到磁盘。我正在读取配置文件,并使用streamreader/streamwriter将HTML文件(使用第三方组件转换为PDF)保存到磁盘。
但我一直在获取路径的版本。对于Azure Files SMB共享的所有磁盘访问,都无法找到错误。如果我使用本地磁盘,它可以正常工作。
我仔细检查了它是否使用了正确的路径,以及该路径是否确实存在(简单地说p:)。
多年来,这在一个共享应用服务器上运行良好。我现在正在尝试将所有内容移动到Azure。
你知道我错过了什么或做错了什么吗?
编辑:
看起来我遇到了这个问题:https://serverfault.com/questions/177139/windows-service-cant-access-network-share
但我不能在这里执行相同的解决方案,因为有了Azure Files,就没有远程服务器可以添加用户。
一位MSDN论坛用户建议使用Azure存储客户端库。我的第三方PDF组件无法重新编程以使用Azure客户端存储库,因此我只能在本地驱动器上完成所有工作,然后将最终的PDF文件复制到Azure文件。
这将是一个完全可以接受的解决方案。但我不知道该怎么做。
您不能从服务或从服务派生的程序对Azure Files SMB共享进行"正常"文件访问。您可以通过编程将文件复制到存储帐户或从存储帐户复制到本地驱动器。您必须使用本地驱动器创建和编辑文件,然后将这些文件复制回您的存储帐户。
以下是一些VB.Net代码,用于将本地文件复制到Azure文件共享(有效,但未清理):
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