Не могу читать / писать в общий доступ к файлам Azure из моего кода.Net
Я написал службу, работающую на виртуальной машине Azure Windows Server 2016. Когда он получает задание из очереди, он порождает другую программу, которая генерирует PDF и сохраняет его на диск. Я читаю файлы конфигурации и сохраняю файлы HTML (которые преобразуются в PDF с использованием стороннего компонента) на диск с помощью streamreader/streamwriter.
Но я продолжаю получать версии пути, не могут быть найдены ошибки для всего доступа к диску общего ресурса Azure Files SMB. Если я использую локальный диск, он работает нормально.
Я дважды проверил, что он использует правильный путь и что путь действительно существует (просто P:).
В течение многих лет это работало нормально на совместном сервере приложений. Я пытаюсь перенести все в Azure прямо сейчас.
Есть идеи, что я пропускаю или делаю не так?
РЕДАКТИРОВАТЬ:
Похоже, я сталкиваюсь с этой проблемой: https://serverfault.com/questions/177139/windows-service-cant-access-network-share
Но я не могу выполнить то же решение здесь, потому что с файлами Azure нет удаленного сервера, к которому я мог бы добавить пользователя.
Пользователь форума MSDN предложил использовать клиентскую библиотеку хранилища Azure. Мой сторонний PDF-компонент не может быть перепрограммирован для использования клиентской библиотеки хранилища Azure, поэтому мне остается выполнить всю свою работу на локальном диске, а затем скопировать окончательный PDF-файл в файлы Azure.
Это было бы полностью приемлемым решением. Но я не знаю, как это осуществить.
1 ответ
Вы не можете получить "нормальный" доступ к файлам для общего ресурса Azure Files SMB из службы или из программы, созданной из службы. Вы можете копировать файлы в свою учетную запись и из нее на локальный диск программным способом. Вы должны использовать локальный диск для создания и редактирования файлов, а затем скопировать их обратно в свою учетную запись хранения.
Вот некоторый код VB.Net для копирования локального файла в общий ресурс Azure Files (работает, но не очищен):
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