Не могу читать / писать в общий доступ к файлам 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
Другие вопросы по тегам