【问题标题】:Issue with Updating file in ADLS Gen2 using Rest-API使用 Rest-API 在 ADLS Gen2 中更新文件的问题
【发布时间】:2019-07-19 18:22:12
【问题描述】:

我正在使用 ADLS Gen2 使用 rest api Path-Update 我正在尝试将数据更新到已经创建的空白文件到 ADLS。 但是每当我尝试使用 API 时,我都会收到来自 API 的响应。 {StatusCode: 202, ReasonPhrase: 'Accepted'} 但文件仍然是空的。

string requestUri = "https://XXXXXXX.dfs.core.windows.net/XXXXX/abc.txt?action=append&position=0";// &retainUncommittedData=false&close=true";
            dynamic method = new HttpMethod("PATCH");
            dynamic request = new HttpRequestMessage(method, requestUri)
            {
                Content = new StringContent("\"requestBody\":\"test\"")
            };`enter code here`
            // Add some defined headers
            request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", authenticationToken);
            request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/octet-stream"));

            // Add some other headers or custom headers
            request.Headers.TryAddWithoutValidation("Content-Length", "0");

            dynamic httpClient = new HttpClient();
            dynamic result = httpClient.SendAsync(request).Result;

我希望数据应该在文件中更新,但现在我得到 202 Accepted 作为响应代码,但文件没有用数据更新

我也尝试使用下面的刷新操作追加是我得到 405 错误的代码

string requestUri = "https://XXXXXX.dfs.core.windows.net/XXXXX/abc.txt?action=append&position=0";// &retainUncommittedData=false&close=true";
        var method = new HttpMethod("PATCH");

        var request = new HttpRequestMessage(method, requestUri)
        {
            Content = new StringContent("\"requestBody\":\"test\"")
        };

        // Add some defined headers
        request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", authenticationToken);
        request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("text/plain"));

        // Add some other headers or custom headers
        // request.Headers.TryAddWithoutValidation("Content-Length", "0");

        var httpClient = new HttpClient();
        var result = httpClient.SendAsync(request).Result;

        string requestUri1 = "https://XXXXX.dfs.core.windows.net/XXXXXX/abc.txt?action=flush&position=0";//&retainUncommittedData=false&close=true";
        using (HttpClient httpClient1 = new HttpClient())
        {

            httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", authenticationToken);
            HttpResponseMessage response = (httpClient.PutAsync(requestUri1, null)).Result;


        }

【问题讨论】:

    标签: azure azure-data-lake


    【解决方案1】:

    更新:

    如果adls gen2中的文件为空,可以使用下面的方法:

            static void Main(string[] args)
            {
                var auth = new AzureServiceTokenProvider();          
    
                const string url = "https://storage.azure.com/";
                string token = auth.GetAccessTokenAsync(url).Result;
                string requestUri = "https://xxx.dfs.core.windows.net/t11/c.txt?action=append&position=0";
                var method = new HttpMethod("PATCH");
    
                string upload_string = "have a nice day!";
    
                var request = new HttpRequestMessage(method, requestUri)
                {
                    Content = new StringContent(upload_string)
                };
    
                // Add some defined headers
                request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
                request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("text/plain"));
                var i = request.Content.AsString().Length;
                Console.WriteLine(request.Content.AsString());
    
                var httpClient = new HttpClient();
                var result = httpClient.SendAsync(request).Result;
    
                Console.WriteLine("append result status code: "+ (int)result.StatusCode);
    
                //for flush    
                string requestUri_2 = "https://xxx.dfs.core.windows.net/t11/c.txt?action=flush&position="+upload_string.Length;
    
                var request_2 = new HttpRequestMessage(method,requestUri_2);
    
                using (HttpClient httpClient_2 = new HttpClient())
                {
                    httpClient_2.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
                    HttpResponseMessage response = httpClient_2.SendAsync(request_2).Result;
                    Console.WriteLine("flush result status code: " + (int)response.StatusCode);
                }
    
              Console.ReadLine();
            }
    

    测试结果如下,我也是在azure中检查的,数据被刷到文件中了。


    收到 202 Accepted 后,您可以调用 action=flush 并传递您希望将数据刷新到的位置。如下:

    https://$STORAGE_ACCOUNT_NAME.dfs.core.windows.net/mydata/data/file1?action=flush&position=10
    

    【讨论】:

    • 感谢@Ivan 是的,我之前的文件中没有任何数据,所以我想不需要刷新。
    • @MBG 需要刷新操作。 append 只是准备数据,flush 实际上是用来上传数据到文件的。
    • 即使我在追加后尝试了刷新操作,但我得到了一些错误,因为 资源不支持指定的 Http 动词。 我是否必须添加任何参数一样的。
    • 请找到上面的sn-p供您参考。
    • @MBG,好的,我会在我身边试一试,稍后会更新你。
    猜你喜欢
    • 1970-01-01
    • 2020-09-15
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    • 2021-11-25
    • 2021-11-26
    • 1970-01-01
    相关资源
    最近更新 更多