2013-06-04 1 views
6

J'essaye d'envoyer un fichier avec HttpClient et si quelque chose du côté de réception échoue je veux renvoyer le même flux de fichier.L'objet est éliminé après PostAsync avec HttpClient

Je crée une requête de publication avec un MultipartFormDataContent, qui contient le flux. Tout va bien quand j'appelle PostAsync pour la première fois. Mais quand j'essaye de répéter la demande j'obtiens System.ObjectDisposedException.

Mon flux de fichiers est éliminé après le premier appel de PostAsync ... Pourquoi et existe-t-il une solution à mon problème?

Voici un exemple de base de ce dont je parle.

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

Répondre

0

Si vous appelez LoadIntoBufferAsync sur l'objet contenu, il copie le flux de fichier dans un MemoryStream dans l'objet StreamContent. De cette façon, l'élimination de HttpContent ne devrait pas fermer votre FileStream. Vous devrez repositionner le pointeur de flux et créer un nouveau StreamContent pour effectuer le second appel.

+0

Devrais-je utiliser streamContent.CopyToAsync ou simplement appeler streamContent.LoadIntoBufferAsync? – zarkobehar

+1

La méthode avec CopyToAsync fonctionne, mais le problème est que je vais doubler l'utilisation de la mémoire pour ce flux. Je ne pense pas que le problème soit le FileStream. J'ai été obligé de passer un MemoryStream comme paramètre de contenu et il est toujours disponible. Quand j'appelle LoadIntoBufferAsync, rien ne change ... – zarkobehar

Questions connexes