Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法使用.NET客户端从ADL中删除可以通过其他方式删除的文件_C#_Azure_Azure Data Lake - Fatal编程技术网

C# 无法使用.NET客户端从ADL中删除可以通过其他方式删除的文件

C# 无法使用.NET客户端从ADL中删除可以通过其他方式删除的文件,c#,azure,azure-data-lake,C#,Azure,Azure Data Lake,我正在从事一个项目,该项目接收文件并将其存储在ADL上,并将其位置和一些元数据存储在CosmosDB中。为了解决这个问题,我正在编写一个.NET控制台应用程序,尝试查找并有选择地删除ADL中不再在CosmosDB记录中引用的文件 此控制台应用程序使用用户凭据而不是服务凭据,因为它将由devops团队使用,我们不希望授予他们删除文件的权限,因为他们没有删除文件的权限 文件的基本代码基于 在developer ADL中使用我自己的凭据运行时,我可以很好地列出文件。我拥有对应该删除的文件的写入权限,以

我正在从事一个项目,该项目接收文件并将其存储在ADL上,并将其位置和一些元数据存储在CosmosDB中。为了解决这个问题,我正在编写一个.NET控制台应用程序,尝试查找并有选择地删除ADL中不再在CosmosDB记录中引用的文件

此控制台应用程序使用用户凭据而不是服务凭据,因为它将由devops团队使用,我们不希望授予他们删除文件的权限,因为他们没有删除文件的权限

文件的基本代码基于

在developer ADL中使用我自己的凭据运行时,我可以很好地列出文件。我拥有对应该删除的文件的写入权限,以及对父文件夹的写入和执行权限。此外,我可以使用Microsoft azure Storage Explorer删除azure门户中的文件

但是,当我使用代码行时:

// helper function taken from MS documentation
var tokenCache = GetTokenCache(Path.Combine(MY_DOCUMENTS, "my.tokencache"));
string adlsFqdn = "<myadlsacount>.azuredatalakestore.net";
// helper function taken from same documentation
var adlCreds = GetCreds_User_Popup(adlsTenant, ADL_TOKEN_AUDIENCE, 
                                   adlsClientId, tokenCache); 
var adlsClient = AdlsClient.CreateClient(adlsFqdn, adlCreds);
IEnumerable<string> = FindUnwantedFilePaths(adlsClient);
// ...
adlsClient.Delete("<samplepath>"); 
//助手函数取自MS文档
var tokenCache=GetTokenCache(Path.Combine(MY_文档,“MY.tokenCache”);
字符串adlsFqdn=“.azuredatalakestore.net”;
//助手函数取自同一文档
var adlCreds=GetCreds\u User\u弹出窗口(adlsTenant、ADL\u TOKEN\u观众、,
adlsClientId,令牌缓存);
var adlsClient=adlsClient.CreateClient(adlsFqdn,adlCreds);
IEnumerable=FindUnwantedFilePath(adlsClient);
// ...
adlsClient.Delete(“”);
然后调用
AdlsClient.Delete
失败,并显示以下消息:

操作:删除失败,HttpStatus:BadRequest错误:JSON解析中出现UEExpected错误。
上次遇到的异常在1次尝试后引发。[U JSON解析中的预期错误]
[ServerRequestId::

我可以很容易地看出我可能做了一些轻微的错误,但由于我可以使用其他工具从ADL中删除其中一些文件,我的帐户似乎没有问题。(尽管我是ADLS组件的所有者)。我环顾四周,没有看到任何人有这样的问题

有人知道我做错了什么吗?如果您不是文件所有者,是否无法使用用户帐户以编程方式删除文件?如果做不到这一点,让某人正确理解错误的含义将是有帮助的。我的猜测是围绕权利有一个微妙的问题,但我不太清楚我到底需要做什么


最后,我可以用其他方式删除这些文件,但这不是重点-为了我正在从事的项目的利益,我需要这个工具来做到这一点。

我找到了一种删除文件的方法,方法是避免使用包装库
Microsoft.Azure.DataLake.Store
,而是使用REST API公开HDFS接口,并添加一个包含正确设置承载令牌

执行此操作的代码段如下所示:

var request = new HttpRequestMessage(HttpMethod.Delete, 
"https://<accountname>.azuredatalakestore.net/webhdfs/v1/<path>?op=DELETE&recursive=false");

// The same adlCreds as in the question. This adds the correct authentication
// token to the request
await adlCreds.ProcessHttpRequestAsync(request, CancellationToken.None);

var client = new HttpClient();
var response = await client.SendAsync(request);

string responseContent = response.Content != null
    ? await response.Content.ReadAsStringAsync()
    : string.Empty;

// response content is JSON equivalent to {"boolean":true}
// if the call to delete succeeded. 
var request=newhttprequestmessage(HttpMethod.Delete,
"https://.azuredatalakestore.net/webhdfs/v1/?op=DELETE&recursive=false");
//和问题中的一样。这将添加正确的身份验证
//请求的令牌
等待adlCreds.ProcessHttpRequestAsync(请求,取消令牌.None);
var client=新的HttpClient();
var response=wait client.sendaync(请求);
字符串responseContent=response.Content!=无效的
? wait response.Content.ReadAsStringAsync()
:string.Empty;
//响应内容是JSON等价于{“boolean”:true}
//如果删除调用成功。

我不明白的是,当直截了当的实现工作时,为什么我在库中得到一个错误的请求。但至少我现在可以删除需要删除的文件。这不是绕过安全性的方法,但是我应该能够删除我试图删除的文件,现在我可以了

导致
“JSON解析中的意外错误”
的一种情况是,如果
文件路径
不是以斜杠开头的,那么请确保以
/{path}
格式向上发送路径,而不仅仅是
{path}
,您是否尝试使用fiddler捕获更多详细信息?您的
samplepath
格式是什么?当我尝试使用fiddler时,我在握手呼叫中遇到了一个客户端证书链错误,因此我在执行此操作时没有获得任何有用的信息。可能是因为我不知道如何正确设置fiddler。如果你在使用fiddler时遇到问题:我同意Tom的意见,一些SDK的错误消息非常糟糕,通常http错误有一个明确的错误消息。