使用Rest-API更新ADLS Gen2中的文件的问题

时间:2019-07-18 18:37:37

标签: azure azure-data-lake

我正在使用rest api路径更新来使用ADLS Gen2,我正在尝试将数据更新到已创建的空白文件中,并将其更新到ADLS中。 但是,每当我尝试使用API​​时,我都会收到来自API的响应。 {状态码:202,原因短语:“已接受”} 但文件仍然为空。

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作为响应代码,但文件未使用数据更新

我也尝试在下面添加刷新操作,这是我得到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;


        }

1 个答案:

答案 0 :(得分:2)

更新

如果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();
        }

测试结果如下,我还检查了天蓝色,将数据刷新到文件中。

enter image description here


一旦您收到202接受,就可以调用action=flush并传递要刷新数据的位置。如下所示:

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