2013-06-04 11 views
6

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 }); 
    } 

Odpowiedz

0

Jeśli zadzwonisz LoadIntoBufferAsync na obiekcie Content będzie skopiowanie pliku Stream do MemoryStream wewnątrz obiektu StreamContent. W ten sposób pozbycie się HttpContent nie powinno zamykać twojego FileStream. Będziesz musiał zmienić położenie wskaźnika strumienia i utworzyć nową StreamContent, aby wykonać drugie połączenie.

+0

Czy powinienem użyć strumienia streamContent.CopyToAsync, czy powinienem po prostu wywołać metodę streamContent.LoadIntoBufferAsync? – zarkobehar

+1

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