HttpClient 未经 Bearer Token 授权

问题描述 投票:0回答:1

由于 HttpWebRequest 已过时,我正在升级到 .NET 6 中的等效项。

我不明白为什么我会收到未经授权的 401。我可以成功获得不记名令牌,但我似乎无法找到正确的组合来成功上传文件。

private static async Task UploadCsvFileAsync(string authToken)
{
    using (var client = new HttpClient())
    {
        client.BaseAddress = new Uri("https://subdomain.domain.com/");
        client.DefaultRequestHeaders
            .Accept
            .Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
        using (var request = new HttpRequestMessage())
        {
            request.RequestUri = new Uri(uploadUrl);
            request.Method = HttpMethod.Post;
            request.Headers.Add("api-version", "1");
            request.Headers.Add("Authorization", $"Bearer {authToken}");

            string header = $"{Environment.NewLine}--{formBoundary}{Environment.NewLine}" +
                $"Content-Disposition: form-data; name=\"csvfile\"; filename=\"{csvFileName}\"{Environment.NewLine}" +
                $"Content-Type: text/csv{Environment.NewLine}{Environment.NewLine}";
            byte[] headerBytes = Encoding.UTF8.GetBytes(header);
            var headerContent = new StreamContent(new MemoryStream(headerBytes));
            headerContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/octet-stream");
            var content = new MultipartFormDataContent();
            content.Add(headerContent, "metadata", csvFileName);

            var response = await client.PostAsync(uploadUrl, content);
            // the response code is 401 - Unauthorized
        }
    }
}

我正在运行 .NET Framework 4.x 代码。由于我们要将代码迁移到 .NET 6,因此必须重写它。

显然我做错了什么——我似乎无法弄清楚我错过了什么。

非常感谢任何帮助。提前谢谢你。

c# file-upload dotnet-httpclient http-status-code-401
1个回答
0
投票

你没有正确使用

HttpClient
。请注意您是如何声明
HttpRequestMessage
的 - 您在其中添加了 auth 标头 - 但从未真正使用过它?您有点将旧方法与新方法混合在一起,而不是实际发送身份验证令牌。

如果你想使用

HttpRequestMessage
,这很好,只需使用
HttpClient.SendAsync
并提供消息。具体在
byte[] headerBytes = Encoding.UTF8.GetBytes(header);
之后试试这个:

      request.Headers.Add("Content-Type", "application/octet-stream");
      var content = new MultipartFormDataContent();                  
      content.Add(new StreamContent(new MemoryStream(headerBytes)), "metadata", csvFileName);
      request.Content = content;
      var response = await client.SendAsync(request);
© www.soinside.com 2019 - 2024. All rights reserved.