由于HttpWebRequest已经过时的事实,我正在升级到.NET6中的等同版本.

我不明白为什么我会收到一辆未经授权的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 Framework4.x代码正常工作.因为我们要将代码迁移到.NET6,所以必须重写.

显然,我做错了什么--我似乎就是想不出我错过了什么.

如有任何帮助,我们不胜感激.提前谢谢您.

Edit:03/29/2023 - including correct code as provided by answer below..

private static async Task UploadCsvFileAsyncV2(string authToken)
{
    using (var client = new HttpClient())
    {
        client.BaseAddress = new Uri(uploadUrl);
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", authToken);
        client.DefaultRequestHeaders
            .Accept
            .Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
        using (var request = new HttpRequestMessage(HttpMethod.Post, "uploads"))
        {
            request.Headers.Add("api-version", "1");
            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
            {
                { headerContent, "metadata", csvFileName }
            };
            request.Content = content;

            var response = await client.SendAsync(request);
        }
    }
}

推荐答案

你用的HttpClient不太对.注意到您如何声明HttpRequestMessage--在其中添加auth标头--但从未实际使用过它?您在某种程度上混合了旧方法和新方法,而不是实际发送身份验证令牌.

如果你想用HttpRequestMessage,这很好,只需用HttpClient.SendAsync并提供信息.在byte[] headerBytes = Encoding.UTF8.GetBytes(header);之后特别try 一下:

      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);

Csharp相关问答推荐

如何使用PDFSharp将文本添加到现有PDF

如何将两个查询结果组合在C#ASP.NET MHC控制器中

C# Json重新初始化动态类型

如何注册接口类型,类型<>

有没有办法在WPF文本框中添加复制事件的处理程序?

在静态模式下实例化配置

共享暂存/生产环境中Azure事件中心的建议配置

在.NET MAUI.NET 8中如何防止按钮点击时出现灰色反馈

如何在C#中实现非抛出`MinBy`?

如何通过属性初始化器强制初始化继承记录内的属性?

每个http请求需要60秒,为什么?

取决于您的数据量的多个嵌套循环

Lambda表达式如何与隐式强制转换一起工作?

RX操作员使用先前值进行扫描,信号来自值本身

具有类型识别的泛型方法

使用switch 类型模式时出现奇怪的编译器行为

单元测试类型为HttpClient with Microsoft.Extensions.Http.Resilience

发布.NET 8 Blazor WebAssembly独立应用程序以进行静态站点部署

我想根据姓氏按字母顺序对包含150行徽章编号、姓氏、名字、地址等的文件进行排序.e

在使用.NET EF Core DbContext属性之前,是否应使用null判断