【问题标题】:Missing Required Header: for adding content in Microsoft Storage Explorer with C#缺少必需的标头:用于使用 C# 在 Microsoft 存储资源管理器中添加内容
【发布时间】:2021-11-10 16:24:38
【问题描述】:

大家好!尝试使用本地 Microsoft Azure 存储通过 c# 中的 Data Lake Service Client 上传文件时遇到问题。
作为模拟器使用的连接字符串: "UseDevelopmentStorage=true"

使用的代码:

DataLakeServiceClient _dataLakeClient = new DataLakeServiceClient(connectionString)
DataLakeFileSystemClient fileSystemClient _dataLakeClient.GetFileSystemClient(containerNameLowercase);
DataLakeDirectoryClient directoryClient = fileSystemClient.GetDirectoryClient(path);
DataLakeFileClient fileClient = await directoryClient.CreateFileAsync(name);

问题发生在:await directoryClient.CreateFileAsync(name)

出现异常:

版本:

  • StorageEmulator:5.10
  • Azure 存储资源管理器:1.23.3
  • 语言:C#

如果您对如何处理有任何建议,请随时回答。

更新:必需的标头是:x-ms-blob-type。 所以我遇到了另一个问题,如何将该标头添加到 DataLakeFileClient 标头?

提前谢谢你

【问题讨论】:

    标签: c# azure-data-lake azure-data-lake-gen2


    【解决方案1】:

    您的代码看起来正确,问题是您的请求中缺少头文件。正如document 中提到的,要首先将文件上传到目录,我们需要通过创建 DataLakeFileClient 类的实例在目标目录中创建文件引用。然后通过调用 DataLakeFileClient.AppendAsync 方法上传文件。最后,我们需要确保通过调用 DataLakeFileClient.FlushAsync 方法完成上传。如下图。

    public async Task UploadFile(DataLakeFileSystemClient fileSystemClient) 
    { 
        DataLakeDirectoryClient directoryClient = fileSystemClient.GetDirectoryClient("my-directory");
        DataLakeFileClient fileClient = await directoryClient.CreateFileAsync("uploaded-file.txt"); 
        FileStream fileStream = File.OpenRead("C:\\Users\\contoso\\Temp\\file-to-upload.txt"); 
        long fileSize = fileStream.Length; 
        await fileClient.AppendAsync(fileStream, offset: 0); 
        await fileClient.FlushAsync(position: fileSize); 
    }
    

    要解决这个问题,首先我们需要找出请求中缺少哪个Header,因为错误代码是MissingRequiredHeader

    尝试使用 fiddler 并查看 http Request and Response 以获得更清晰的视图并找出缺少哪个标头并尝试添加所需的标头from this page (例如 x-ms-blob-type)。

    我还建议您在连接字符串中指定显式服务端点,而不是使用默认端点。有关更多信息,请查看 MS 文档的 Create a connection string for an explicit storage endpoint 部分。

    【讨论】:

    • 当我尝试在上面代码中的代码中创建文件时出现问题,也在您的 document 他们使用连接到 azure datalake。使用提琴手它不会返回丢失的标题。还使用了显式服务端点。我遇到的主要问题是在哪里正确添加标题。试图 fileClient.SetHttpHeaders。也许我做错了,但感谢您的回复。我会为问题添加更多描述。
    • 重新检查了 fiddler,它说 x-ms-blob-type 丢失。所以我应该以某种方式将它添加到标题中。感谢您的帮助!
    猜你喜欢
    • 2020-07-09
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-09
    • 1970-01-01
    • 2020-03-14
    相关资源
    最近更新 更多