2013-06-04 18 views
6

ile PostAsync sonra yerleştirilir HttpClient ile bir dosya göndermeye çalışıyorum ve alıcı tarafında bir şey başarısız olursa aynı dosya akışını yeniden göndermek istiyorum.Nesne HttpClient

Akış içeren MultipartFormDataContent ile bir posta isteği oluşturuyorum. PostAsync'i ilk defa aradığımda her şey iyi görünüyor. Ancak isteği tekrarlamaya çalıştığımda System.ObjectDisposedException alıyorum.

Dosya akışım, PostAsync ilk çağrısından sonra imha edilir ... Neden ve benim sorunumun bir çözümü var mı?

İşte ben neden bahsettiğimin temel bir örneğidir. İçerik nesne üzerinde LoadIntoBufferAsync ararsanız

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

cevap

0

o StreamContent nesnesinin içinde memorystream içine dosya akışı kopyalar. Bu şekilde, HttpContent'i atmanız FileStream'inizi kapatmamalıdır. Akış işaretçisini yeniden konumlandırmanız ve ikinci aramayı yapmak için yeni bir StreamContent oluşturmanız gerekecektir.

+0

StreamContent.CopyToAsync kullanmalı mıyım yoksa streamContent.LoadIntoBufferAsync mi çağırmalıyım? – zarkobehar

+1

CopyToAsync ile yöntem çalışır, ancak sorun, bu akış için bellek kullanımını iki katına çıkaracağım. Sorunun FileStream olduğunu düşünmüyorum. Bir MemoryStream'i içerik parametresi olarak geçmek için aldım ve hala atıyor. LoadIntoBufferAsync'i aradığımda hiçbir şey değişmez ... – zarkobehar