2013-06-04 28 views
6

Tôi đang cố gắng gửi một tệp với HttpClient và nếu một cái gì đó ở phía bên nhận không thành công, tôi muốn gửi lại cùng một luồng tệp.Đối tượng được xử lý sau khi PostAsync với HttpClient

Tôi đang tạo yêu cầu đăng bài với một MultipartFormDataContent, chứa luồng. Mọi thứ đều ổn khi tôi gọi PostAsync lần đầu tiên. Nhưng khi tôi cố gắng lặp lại yêu cầu, tôi nhận được System.ObjectDisposedException.

Luồng tệp của tôi được xử lý sau cuộc gọi đầu tiên của PostAsync ... Tại sao và có giải pháp cho vấn đề của tôi?

Đây là ví dụ cơ bản về những gì tôi đang nói đến.

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

Trả lời

0

Nếu bạn gọi LoadIntoBufferAsync trên đối tượng Nội dung, nó sẽ sao chép luồng tệp vào bộ nhớ trong đối tượng StreamContent. Bằng cách này, xử lý HttpContent không nên đóng FileStream của bạn. Bạn sẽ cần định vị lại con trỏ luồng và tạo một StreamContent mới để thực hiện cuộc gọi thứ hai.

+0

Tôi có nên sử dụng streamContent.CopyToAsync hoặc tôi chỉ nên gọi streamContent.LoadIntoBufferAsync? – zarkobehar

+1

Phương thức với CopyToAsync hoạt động, nhưng vấn đề là tôi sẽ tăng gấp đôi mức sử dụng bộ nhớ cho luồng này. Tôi không nghĩ rằng vấn đề là FileStream. Tôi đã cố gắng vượt qua MemoryStream như một tham số nội dung và nó vẫn được xử lý. Khi tôi gọi LoadIntoBufferAsync không có gì thay đổi ... – zarkobehar