2013-06-04 175 views
6

我想用HttpClient發送一個文件,如果接收方的東西失敗我想重新發送相同的文件流。PostAsync與HttpClient後處理對象

我正在創建一個包含流的MultipartFormDataContent的發佈請求。 當我第一次調用PostAsync時,一切看起來都很好。但是當我嘗試重複請求時,我得到System.ObjectDisposedException。

我的文件流是在第一次PostAsync調用後處理的......爲什麼和我的問題有解決方案?

這裏是我在說什麼的基本例子。

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

回答

0

如果您在Content對象上調用LoadIntoBufferAsync,它會將文件流複製到StreamContent對象內的內存流中。這樣,處置HttpContent不應該關閉你的FileStream。您將需要重新定位流指針並創建一個新的StreamContent以進行第二個調用。

+0

我應該使用streamContent.CopyToAsync還是我應該調用streamContent.LoadIntoBufferAsync? – zarkobehar

+1

使用CopyToAsync的方法起作用,但問題是我會將此流的內存使用量加倍。我不認爲問題是FileStream。我試圖通過一個MemoryStream作爲內容參數,它仍然處置。當我調用LoadIntoBufferAsync時,沒有任何更改... – zarkobehar