2017-10-12 53 views
0

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

但我不断收到版本路径找不到所有磁盘访问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文件。

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

+0

请编辑您的问题表现出一些细节(如你的代码中,实际共享配置等)。没有看到任何细节,你只会猜测。 –

+0

你的意思是什么“在Windows服务器上运行的服务”? Windows服务或Web应用程序暴露Web服务?另一点:我明白,P:是一个映射网络共享。你在哪个用户下创建了映射?服务运行的是同一个用户吗?还要添加有关您获得的错误的信息/完整堆栈跟踪 –

回答

0

您不能对从服务产生的服务或程序中的Azure文件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