C# 尝试从Azure Data Lake删除文件时引发异常
小序言:我正在使用C# 尝试从Azure Data Lake删除文件时引发异常,c#,.net,azure-data-factory,azure-data-lake,C#,.net,Azure Data Factory,Azure Data Lake,小序言:我正在使用ADF将文件从Azure Data Lake Store存档(复制和删除)到Azure Blob Storage,我的管道有两个活动1复制活动(将文件从ADLS复制到Blob)2.自定义.NET活动(从ADLS删除文件) 现在,ADF的日程安排完美,运行平稳,没有错误-复制活动一切正常,可以看到复制到Blob的文件。我的问题是自定义.NET活动-没有记录任何错误(我使用的是IActivityLogger),但没有删除文件。因此,我开始通过ADL.NET SDK代码部分进行调试,
ADF
将文件从Azure Data Lake Store
存档(复制和删除)到Azure Blob Storage
,我的管道有两个活动1<代码>复制活动(将文件从ADLS
复制到Blob
)2.自定义.NET活动
(从ADLS
删除文件)
现在,ADF
的日程安排完美,运行平稳,没有错误-复制活动
一切正常,可以看到复制到Blob
的文件。我的问题是自定义.NET活动
-没有记录任何错误(我使用的是IActivityLogger
),但没有删除文件。因此,我开始通过ADL.NET SDK代码部分进行调试,并面临以下问题-
用户代码未处理Microsoft.Azure.Management.DataLake.Store.Models.AdlErrorException
HResult=-2146233088
消息=操作返回了无效的状态代码“禁止”
Source=Microsoft.Azure.Management.DataLake.Store
堆栈跟踪:
在Microsoft.Azure.Management.DataLake.Store.FileSystemOperations.d_u28.MoveNext()上
---来自引发异常的上一个位置的堆栈结束跟踪---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
在Microsoft.Azure.Management.DataLake.Store.FileSystemOperationsExtensions.d_u39.MoveNext()上
---来自引发异常的上一个位置的堆栈结束跟踪---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
位于Microsoft.Azure.Management.DataLake.Store.FileSystemOperationsExtensions.Delete(IFileSystemOperations操作、字符串accountName、字符串文件路径、Nullable'1递归)
在C:\Projects\C\#\DataLakeApplication\DataLakeApplication\Program.cs中的DataLakeApplication.dotnetaldapplication.ADLApplication(列表中的1个dataSetsToDelete)处:第117行
内部异常:
delete
操作的代码段:
var fileDeleterResult =
_adlsFileSystemClient.FileSystem.Delete(_adlsAccountName, strInputToDelete, null);
我在.NET代码中使用AAD服务主体
与adl
通信,身份验证部分还可以,甚至我还尝试了其他一些文件系统操作
列表文件状态
&GetFileStatus
——这些都很好。只有我的Delete
抛出了上述错误,因此我想检查一下我的Service Principal
的ADLS
权限,它被授予Owner
-角色和RWX
对ADLS
文件夹的权限
任何潜在客户都将不胜感激,如果需要关于这方面的进一步信息,请务必告诉我。我注意到ADL中有一些有趣的许可业务 需要仔细检查的几件事: 如果您还没有(我相信您已经)阅读以下内容: 密切关注权限的非级联性质以及掩码的工作方式 但是,正如您所说,用户拥有所有者权限,这应该意味着全能 尝试重新应用包括子项在内的权限(如果适用于您的安全模型),以查看这是否修复了问题
我还想知道是否可能会发现一些东西(我不确定,我自己也没有看过)。我注意到一些关于ADL中权限的有趣的事情 需要仔细检查的几件事: 如果您还没有(我相信您已经)阅读以下内容: 密切关注权限的非级联性质以及掩码的工作方式 但是,正如您所说,用户拥有所有者权限,这应该意味着全能 尝试重新应用包括子项在内的权限(如果适用于您的安全模型),以查看这是否修复了问题
我还想知道是否可能会找到一些东西(我不确定,我自己也没有看过)。最终能够解决它,我的错误基本上是我试图通过
Azure Data Lake
文件夹路径,而不是给我禁止的错误消息的文件路径。
我用来删除文件夹中文件的代码-
foreach (string strInputToDelete in dataSetsToDelete)
{
Console.WriteLine("Listing files and directories.");
var itemList = _adlsFileSystemClient.FileSystem.ListFileStatus(_adlsAccountName, strInputToDelete).FileStatuses.FileStatus.ToList();
var fileMenuItems = itemList.Select(a => String.Format("{0,15} {1}", a.Type, a.PathSuffix));
Console.WriteLine(String.Join("\r\n", fileMenuItems));
Console.WriteLine("Files and directories listed.");
for (int i = 0; i < itemList.Count; i++)
{
Console.WriteLine("Deleting files...");
var fileDeleteResult =_adlsFileSystemClient.FileSystem.Delete(_adlsAccountName, strInputToDelete + itemList[i].PathSuffix);
Console.WriteLine("Deletion result: " + fileDeleteResult.OperationResult.ToString());
Console.WriteLine("Files deleted");
}
}
foreach(dataSetsToDelete中的strInputToDelete字符串)
{
WriteLine(“列出文件和目录”);
var itemList=_adlsFileSystemClient.FileSystem.ListFileStatus(_adlsAccountName,strInputToDelete).FileStatus.FileStatus.ToList();
var fileMenuItems=itemList.Select(a=>String.Format(“{0,15}{1}”,a.Type,a.PathSuffix));
Console.WriteLine(String.Join(“\r\n”,fileMenuItems));
WriteLine(“列出的文件和目录”);
for(int i=0;i
最终解决了这个问题,我的错误基本上是我试图通过Azure Data Lake
文件夹路径,而不是文件路径,文件路径给了我禁止的
错误消息。
我用来删除文件夹中文件的代码-
foreach (string strInputToDelete in dataSetsToDelete)
{
Console.WriteLine("Listing files and directories.");
var itemList = _adlsFileSystemClient.FileSystem.ListFileStatus(_adlsAccountName, strInputToDelete).FileStatuses.FileStatus.ToList();
var fileMenuItems = itemList.Select(a => String.Format("{0,15} {1}", a.Type, a.PathSuffix));
Console.WriteLine(String.Join("\r\n", fileMenuItems));
Console.WriteLine("Files and directories listed.");
for (int i = 0; i < itemList.Count; i++)
{
Console.WriteLine("Deleting files...");
var fileDeleteResult =_adlsFileSystemClient.FileSystem.Delete(_adlsAccountName, strInputToDelete + itemList[i].PathSuffix);
Console.WriteLine("Deletion result: " + fileDeleteResult.OperationResult.ToString());
Console.WriteLine("Files deleted");
}
}
foreach(dataSetsToDelete中的strInputToDelete字符串)
{
WriteLine(“列出文件和目录”);
var itemList=_adlsFileSystemClient.FileSystem.ListFileStatus(_adlsAccountName,strInputToDelete).FileStatus.FileStatus.ToList();
var fileMenuItems=itemList.Select(a=>String.Format(“{0,15}{1}”,a.Type,a.PathSuffix));
Console.WriteLine(String.Join(“\r\n”,fileMenuItems));
Console.WriteLine(“文件a