【问题标题】:How to send a json file with HttpClient in C#?如何在 C# 中使用 HttpClient 发送 json 文件?
【发布时间】:2020-07-07 21:29:56
【问题描述】:

我正在尝试使用邮递员发送 JSON 文件并且它正在工作。但是当我尝试通过HttpClient 发送相同的内容时,它不起作用。

System.IO.File.WriteAllText(dirName + "\\importproduct.json", jsonitems);
var fileByteArray = File.ReadAllBytes(dirName + "\\importproduct.json");

using (var _client = new HttpClient())
{
    using (var content = new MultipartFormDataContent())
    {
        content.Add(new StreamContent(new MemoryStream(fileByteArray)), "file");
        var url = $"{firmInfo.ServiceUrl}/product/api/products/import";
        _client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", bearer_token.id_token);

        var response = _client.PostAsJsonAsync(url, content).Result;
        var result = response.Content.ReadAsStringAsync().Result;
    }
}

邮递员:

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    而不是使用 PostAsJsonAsync();您应该使用 PostAsync() 的方法;所以你的代码应该是这样的

    using (var _client = new HttpClient())
    {
        using (var content = new MultipartFormDataContent())
        {
            content.Add(new StreamContent(new MemoryStream(fileByteArray)), "file");
            var url = $"{firmInfo.ServiceUrl}/product/api/products/import";
            _client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", bearer_token.id_token);
    
            var response = _client.PostAsync(url, content).Result;
            var result = response.Content.ReadAsStringAsync().Result;
        }
    }
    

    【讨论】:

    • 欢迎来到 SO,maina :)
    • 这是有效的,但主要问题是服务器上的应用程序响应我“找不到文件”他们看不到文件,但我可以通过“文件”键从邮递员发送它。
    • @efecetir 我建议使用 Telerik 的 Fiddler 之类的东西比较这两个请求,看看有什么区别。
    • 我不确定 100%,但我希望 HttpClient.SendJsonAsync() 将 http 内容类型设置为“application/json”,而 Postman 内容类型将设置为“multipart/form-data”。跨度>
    【解决方案2】:

    PostAsJsonAsync 方法是一个泛型方法,它期望将被序列化并在 POST 正文中发送的对象作为第二个参数。

    var obj = JsonConvert.DeserializeObject<SomeModelClass>(jsonString);
    var response = await _client.PostAsJsonAsync(url, obj).Result;
    

    【讨论】:

      【解决方案3】:

      这是基于上面的efecetir's 帖子。这个对我有用。顺便说一句,我也赞成他的帖子。 我的问题是我需要在基于内容的级别设置内容类型。

      var fileByteArray = File.ReadAllBytes(filePath);
      
      HttpContent bytesContent = new ByteArrayContent(fileByteArray);
      using (var httpClient = new HttpClient())
      using (var formData = new MultipartFormDataContent())
      {
          var RequestUri = new Uri($"http://whatever.com/");
          //client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", bearer_token.id_token);
      
          formData.Headers.Add("super-secret-key", "blah");
          bytesContent.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json");
          
          //httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); //("multipart/form-data")); // Not needed
          formData.Add(bytesContent, "file", "blah.json");
          var response = httpClient.PostAsync(RequestUri, formData).Result;
          return await HandleResponse(response);
      }
      

      【讨论】:

        【解决方案4】:

        感谢您的 cmets。 我修复了它并将我的代码转换如下。现在它可以工作了,而且更干净了。

        HttpContent bytesContent = new ByteArrayContent(fileByteArray);
                using (var client = new HttpClient())
                using (var formData = new MultipartFormDataContent())
                {
                    var url = $"{firmInfo.ServiceUrl}/product/api/products/import";
                    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", bearer_token.id_token);
        
                    formData.Add(bytesContent, "file", "importproduct.json");
                    var response = client.PostAsync(url, formData).Result;
                    var result = response.Content.ReadAsStringAsync().Result;
        
                }
        

        【讨论】:

        • 您可以通过点赞和接受最佳答案来表达您的感激之情,而不是复制粘贴他人的作品! -1 来自我。
        • 我尝试了我分享的链接stackoverflow.com/a/19664927/3363877,它适用于我的情况。
        【解决方案5】:

        这是我用来发布表单信息和文件的代码

        using (var httpClient = new HttpClient())
        {
        
            var surveyBytes = ConvertToByteArray(surveyResponse);
        
        
            httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        
            var byteArrayContent =   new ByteArrayContent(surveyBytes);
        
            byteArrayContent.Headers.ContentType = MediaTypeHeaderValue.Parse("text/csv");
               var url = $"{firmInfo.ServiceUrl}/product/api/products/import";
            var response = await httpClient.PostAsync(url , new MultipartFormDataContent
            {  
                {byteArrayContent, "\"file\"", dirName + "\\importproduct.json"}
            });
        
            return response;
        }
        

        这适用于 .net 4.5。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-07-19
          • 2014-11-16
          • 1970-01-01
          • 2011-09-07
          相关资源
          最近更新 更多