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