Загрузка составного файла через HttpClient C#

#c# #asp.net #.net #curl #httpclient

#c# #asp.net #.net #curl #httpclient

Вопрос:

Я пытаюсь преобразовать запрос post, представленный через cURL, в c # HttpClient с использованием старого приложения.NETFramework4

Нотация cURL запроса из документов API:

 curl -X POST -H 'Authorization: Token token=sfg999666t673t7t82' -H 'Content-Type: multipart/form-data' -H 'content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW' -F file=@/Users/user1/Downloads/download.jpeg -F file_name=nameForFile -F is_shared=true -F targetable_id=1 -F targetable_type=Lead -X POST "https://domain.freshsales.io/api/documents"
  

Мой код на C # в настоящее время принимает файл, загруженный пользователем через форму ввода, и пытается загрузить:

 var filename = String.Format("status_{0}", DateTime.Now.ToString("dd/MM"));
        using (var content = new MultipartFormDataContent())
        {
            content.Add(new ByteArrayContent(file), "file", filename);
            content.Add(new StringContent(filename), "file_name");
            content.Add(new StringContent("true"), "is_shared");
            content.Add(new StringContent(uID), "targetable_id");
            content.Add(new StringContent("Contact"), "targetable_type");
            
            HttpRequestMessage req = new HttpRequestMessage(HttpMethod.Post, $"documents") { Content = content };

            return client.SendAsync(req).Resu<
        }
  

На данный момент я всегда получаю BadRequest (400)

В PostMan я могу получить OK (201)..

Для получения дополнительной информации это код, который PostMan представляет для C # RestSharp (не уверен, как полностью перевести if в HttpClient byteArrayContent..

 var client = new RestClient("mydomain.io/api/documents");
client.Timeout = -1;
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Token token=xxx");
request.AddFile("file", "/Users/user1/Desktop/sc.png");
request.AddParameter("targetable_id", "134");
request.AddParameter("targetable_type", "Contact");
request.AddParameter("name", "a.jpg");
IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
  

Комментарии:

1. Вы сравнивали HTTP-запросы, используя такие инструменты, как Fiddler или Wireshark? Видите в них что-нибудь другое? Рассматривали ли вы возможность использования RestSharp вместо HttpClient?

2. @mason Я не думаю, что смогу использовать RestSharp, поскольку это старый .netFramework4.0

3. Почему вы используете неподдерживаемую версию .NET? Вы должны обновиться до последней версии 4.X. И вы можете использовать RestSharp 105.2.3 , который поддерживает .NET Framework 4.0.

4. @mason дело в том, что, как вы можете видеть даже в примере RestSharp, который я опубликовал, метод .addFile требует путь к локальному файлу, тогда как в моем приложении файл поступает как поток / байтовый массив из формы ввода… Так что я действительно не уверен, как мне это перевести..

5. Предположительно, существует перегрузка этого метода или другого метода с аналогичным именем, который будет принимать массив байтов. Если вы просто попробуете это , тогда Intellisense (вы используете Visual Studio, верно?) должно помочь вам найти подходящий метод …….. Вы все еще не ответили на мой вопрос относительно Fiddler или Wireshark.