从Azure功能访问Azure文件存储

时间:2016-10-18 13:12:11

标签: azure batch-file azure-sql-database azure-functions

我尝试从Azure文件存储中检索文件以供在Azure函数中执行的.exe使用,并且似乎无法通过UNC凭据。

我的应用从Azure SQL数据库中获取UNC文件路径,然后尝试导航到该UNC路径(在Azure文件存储中)以导入文件的内容。我可以在Windows资源管理器中从我的电脑导航到文件位置,但我被提示输入凭据。

我尝试过使用" net use"在执行应用程序之前执行命令,但它似乎没有进行身份验证。

net use \\<storage account>.file.core.windows.net\<directory>\ /u:<username> <access key>

MyApp.exe 

Azure功能日志错误:

Unhandled Exception: System.UnauthorizedAccessException: Access to the path '<file path>' is denied.

如果可能的话,我宁愿不修改我的C#应用​​程序并在Azure功能中进行身份验证(此时它的批处理功能将基于计时器)。

2 个答案:

答案 0 :(得分:6)

我认为由于您无法访问底层基础架构(same deal as WebApps),因此无法在Azure File Service Share中安装Azure Function

您可以使用Azure Storage SDK作为Azure Storage REST API的包装,并在您的应用程序中使用它与文件服务共享中的文件进行交互。

答案 1 :(得分:1)

您无法使用SMB(445 / TCP)。函数在App Service沙箱中运行。

来自https://github.com/projectkudu/kudu/wiki/Azure-Web-App-sandbox#restricted-outgoing-ports

  

受限制的传出端口

     

无论地址如何,应用程序无法使用端口445,137,138和139 连接到任何地方。换句话说,即使连接到非私有IP地址或虚拟网络的地址,也不允许连接到端口445,137,138和139.

Use the Azure Storage SDK与您的Azure文件端点进行通信:

using Microsoft.Azure;  // Namespace for CloudConfigurationManager
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.File;

// Parse the connection string and return a reference to the storage account.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
    CloudConfigurationManager.GetSetting("StorageConnectionString"));

// Create a CloudFileClient object for credentialed access to File storage.
CloudFileClient fileClient = storageAccount.CreateCloudFileClient();

// Get a reference to the file share we created previously.
CloudFileShare share = fileClient.GetShareReference("logs");

// Ensure that the share exists.
if (share.Exists())
{
    // Get a reference to the root directory for the share.
    CloudFileDirectory rootDir = share.GetRootDirectoryReference();

    // Get a reference to the directory we created previously.
    CloudFileDirectory sampleDir = rootDir.GetDirectoryReference("CustomLogs");

    // Ensure that the directory exists.
    if (sampleDir.Exists())
    {
        // Get a reference to the file we created previously.
        CloudFile file = sampleDir.GetFileReference("Log1.txt");

        // Ensure that the file exists.
        if (file.Exists())
        {
            // Write the contents of the file to the console window.
            Console.WriteLine(file.DownloadTextAsync().Result);
        }
    }
}

示例使用CloudConfigurationManager - 我认为对于这样一个简单的场景来说有点太多了。我会这样做:

using System.Configuration;

// "StorConnStr" is the Storage account Connection String
// defined for your Function in the Azure Portal
string connstr = ConfigurationManager.ConnectionStrings["StorConnStr"].ConnectionString;