Próbuję wysłać plik z HttpClient i jeśli coś po stronie odbiorczej nie powiedzie się Chcę ponownie wysłać ten sam strumień pliku.Obiekt jest usuwany po PostAsync z HttpClient
Tworzę żądanie wpisu z MultartFormDataContent, który zawiera strumień. Wszystko wygląda dobrze, gdy po raz pierwszy dzwonię do PostAsync. Ale kiedy próbuję powtórzyć żądanie, otrzymuję System.ObjectDisposedException.
Mój strumień plików jest usuwany po pierwszym wywołaniu funkcji PostAsync ... Dlaczego i czy istnieje rozwiązanie mojego problemu?
Oto podstawowy przykład tego, o czym mówię.
public ActionResult Index()
{
var client = new HttpClient { BaseAddress = new Uri(Request.Url.AbsoluteUri) };
var fi = new FileInfo(@"c:\json.zip");
using (var stream = fi.OpenRead())
{
var content = new MultipartFormDataContent();
var streamContent = new StreamContent(stream);
streamContent.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
streamContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
{
FileName = "\"File\""
};
content.Add(streamContent);
var isSuccess = client.PostAsync("Home/Put", content).
ContinueWith(x => x.Result.Content.ReadAsAsync<JsonResponse>().Result.Success).Result;
//stream is already disposed
if (!isSuccess)
{
isSuccess = client.PostAsync("Home/Put", content).
ContinueWith(x => x.Result.Content.ReadAsAsync<JsonResponse>().Result.Success).Result;
}
}
return View();
}
public JsonResult Put(HttpPostedFileBase file)
{
return Json(new JsonResponse { Success = false });
}
Czy powinienem użyć strumienia streamContent.CopyToAsync, czy powinienem po prostu wywołać metodę streamContent.LoadIntoBufferAsync? – zarkobehar
Metoda z CopyToAsync działa, ale problem polega na tym, że podwoję zużycie pamięci dla tego strumienia. Nie sądzę, że problemem jest FileStream. Próbowałem przekazać MemoryStream jako parametr zawartości i nadal go zbywa. Kiedy dzwonię do LoadIntoBufferAsync nic się nie zmienia ... – zarkobehar