Отправьте StringContent и StreamContent в том же сообщении на сервер

Я хотел бы отправить строковые параметры и файл на веб-сервер. у меня ошибка с streamContent Это мой код

using (var client = new HttpClient())
{
  using (var content = new MultipartFormDataContent())
  {
   content.Add(new StringContent("loginTest"), "login");
   content.Add(new StringContent("toto"), "username");
   using (fileStream = new FileStream("C:\\test.pdf", FileMode.Open, 
          FileAccess.Read, FileShare.Read, 4096, useAsync: true))
    {
     var filestreamContent = new StreamContent(fileStream, 4096);
     content.Add(filestreamContent, "documentUpload", "test.pdf");

     using (var message = client.PostAsync("http://serverUrl/Create? 
      method=init", content))
     {
      var input = message.Result.Content.ReadAsStringAsync().Result;
      }
    }
   }
 }

и это снимок экрана с ошибкой: System.ObjectDisposedException https://i.imgur.com/IHspYbB.jpg

2 ответа

При передаче fileStream в качестве параметра конструктору StreamContent он становится владельцем. Т.е. при удалении filestreamContent он также удаляет fileStream. При добавлении filestreamContent к контенту он также становится владельцем, т. Е. При утилизации контента он проходит по всем частям, а затем удаляет их.

И HttpClient.PostAsync в конце концов вызовет закрытую функцию HttpClient.DisposeRequestContent, которая, в свою очередь, удаляет содержимое, которое закрывает и удаляет все связанные потоки. Это по замыслу.

Вы просто видите конечный результат, и, насколько я могу судить, вы не получаете никаких ошибок или исключений, кроме случаев, когда пытаетесь получить доступ к членам теперь расположенных объектов в отладчике.

вы можете использовать это.

      using (var httpClient = new HttpClient())
  {
   MemoryStream img = new MemoryStream();
   imgFile.InputStream.CopyTo(img1);
   img1.Seek(0, SeekOrigin.Begin);
   Dictionary<string, string> parameters = new Dictionary<string, string>();

   parameters.Add("Token", model.Token);
   parameters.Add("Phone", model.Phone);
   parameters.Add("FullName", model.FullName);
   
                  
   using (var content = new MultipartFormDataContent())
     {
      content.Add(new StreamContent(img1), "Image", "Image." + Path.GetExtension(national.FileName));
      HttpContent dictionaryItems = new FormUrlEncodedContent(parameters);
      content.Add(dictionaryItems, "AuthenticationViewModel");
                       
      var url = "mysite/api/People/InsertInfo";

      var response = await httpClient.PostAsync(url, content);
      var responseModel =
      JsonConvert.DeserializeObject<ResponseModel>(
                                (await response.Content.ReadAsStringAsync()));
     if (responseModel.IsSuccess)
                            return Json(new { IsSuccess = true }, JsonRequestBehavior.AllowGet);
     }

    }

И в Api

       var request = HttpContext.Current.Request;
 bool files = (request.Files.Count != 0);

 string data = request.Form.GetValues("AuthenticationViewModel").First();
 NameValueCollection model = HttpUtility.ParseQueryString(data);
 var token = model.GetValues("Token").First()
Другие вопросы по тегам