我尝试从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功能中进行身份验证(此时它的批处理功能将基于计时器)。
答案 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;