如何为 ADLS Gen-2 作为流传递 Body

how to pass Body for ADLS Gen-2 as a stream

我正在使用 ADLS Gen2 Path-Update API 从已创建的 ADLS 更新文件。 作为一个 body,我可以轻松传递工作正常但与 Stream 相同但不起作用的字符串。

我正在读取本地文件数据并尝试将其存储到流中并作为 body 传递,但收到 Http 请求 header 无效的错误

我身边有一个快速测试,下面的代码将本地文件读取为流,然后将流上传到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/b.txt?action=append&position=0";
            var method = new HttpMethod("PATCH");

            // read local file as stream
            var mystream = File.OpenRead(@"D:\temp\test1.txt");
            Console.WriteLine($"the stream length is: {mystream.Length}");
            Console.WriteLine($"the position of the stream is: {mystream.Position}");

            var stream_length = mystream.Length;

            var request = new HttpRequestMessage(method, requestUri)
            {
                //Content = new StringContent(upload_string)
                Content = new StreamContent(mystream)
            };

            // 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/b.txt?action=flush&position="+stream_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);
            }