2013-06-04 16 views
6

Sto tentando di inviare un file con HttpClient e se qualcosa sul lato ricezione fallisce, voglio reinviare lo stesso flusso di file.L'oggetto viene eliminato dopo PostAsync con HttpClient

Sto creando una richiesta di post con un MultipartFormDataContent, che contiene lo stream. Tutto sembra a posto quando chiamo PostAsync per la prima volta. Ma quando provo a ripetere la richiesta ottengo System.ObjectDisposedException.

Il mio flusso di file viene eliminato dopo la prima chiamata di PostAsync ... Perché e c'è una soluzione al mio problema?

Ecco un esempio di base di cosa sto parlando.

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

risposta

0

Se si chiama LoadIntoBufferAsync sull'oggetto Content copierà il flusso di file in un MemoryStream all'interno dell'oggetto StreamContent. In questo modo, l'eliminazione di HttpContent non dovrebbe chiudere il FileStream. Sarà necessario riposizionare il puntatore dello stream e creare un nuovo StreamContent per effettuare la seconda chiamata.

+0

Devo utilizzare streamContent.CopyToAsync o dovrei semplicemente chiamare streamContent.LoadIntoBufferAsync? – zarkobehar

+1

Il metodo con CopyToAsync funziona, ma il problema è che raddoppierò l'utilizzo della memoria per questo flusso. Non penso che il problema sia il FileStream. Ho cercato di passare un MemoryStream come parametro del contenuto ed è ancora disponibile. Quando chiamo LoadIntoBufferAsync nulla cambia ... – zarkobehar

Problemi correlati