Отправьте 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()