从 Azure 函数访问 Azure 文件存储
Accessing Azure File Storage from Azure Function
我正在尝试从 Azure 文件存储中检索一个文件,以供在 Azure 函数中执行的 .exe 使用,但似乎无法通过 UNC 凭据。
我的应用程序从 Azure SQL 数据库中获取 UNC 文件路径,然后尝试导航到该 UNC 路径(在 Azure 文件存储中)以导入文件的内容。我可以在 windows 资源管理器中从我的 PC 导航到文件位置,但系统提示我输入凭据。
我试过在执行应用程序之前使用 "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 函数中进行身份验证(目前它是一个批处理函数,将基于计时器)。
我认为无法在 Azure Function
中安装 Azure File Service Share
,因为您无法访问底层基础设施 ()。
您可以使用 Azure Storage SDK
,它是 Azure Storage REST API
的包装器,并在您的应用程序中使用它来与文件服务共享中的文件进行交互。
您不能使用 SMB (445/TCP)。应用服务沙箱内的函数 运行。
来自https://github.com/projectkudu/kudu/wiki/Azure-Web-App-sandbox#restricted-outgoing-ports:
Restricted Outgoing Ports
Regardless of address, applications cannot connect to anywhere using ports 445, 137, 138, and 139. In other words, even if connecting to a non-private IP address or the address of a virtual network, connections to ports 445, 137, 138, and 139 are not permitted.
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;
我正在尝试从 Azure 文件存储中检索一个文件,以供在 Azure 函数中执行的 .exe 使用,但似乎无法通过 UNC 凭据。
我的应用程序从 Azure SQL 数据库中获取 UNC 文件路径,然后尝试导航到该 UNC 路径(在 Azure 文件存储中)以导入文件的内容。我可以在 windows 资源管理器中从我的 PC 导航到文件位置,但系统提示我输入凭据。
我试过在执行应用程序之前使用 "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 函数中进行身份验证(目前它是一个批处理函数,将基于计时器)。
我认为无法在 Azure Function
中安装 Azure File Service Share
,因为您无法访问底层基础设施 (
您可以使用 Azure Storage SDK
,它是 Azure Storage REST API
的包装器,并在您的应用程序中使用它来与文件服务共享中的文件进行交互。
您不能使用 SMB (445/TCP)。应用服务沙箱内的函数 运行。
来自https://github.com/projectkudu/kudu/wiki/Azure-Web-App-sandbox#restricted-outgoing-ports:
Restricted Outgoing Ports
Regardless of address, applications cannot connect to anywhere using ports 445, 137, 138, and 139. In other words, even if connecting to a non-private IP address or the address of a virtual network, connections to ports 445, 137, 138, and 139 are not permitted.
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;