2013-06-04 36 views
6

HttpClientでファイルを送信しようとしています。受信側で何かが失敗した場合、同じファイルストリームを再送信します。HttpClientでPostAsyncの後にオブジェクトが破棄される

ストリームを含むMultipartFormDataContentを使用して投稿リクエストを作成しています。 PostAsyncを初めて呼び出すとすべてがうまく見えます。しかし、私は要求を繰り返すために私はSystem.ObjectDisposedExceptionを取得します。

私のファイルストリームは、PostAsyncの最初の呼び出し後に破棄されます...なぜ、私の問題の解決方法はありますか?

これは私が何を話しているのかの基本的な例です。 [コンテンツオブジェクトにLoadIntoBufferAsyncを呼び出す場合

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

それはStreamContentオブジェクト内部のMemoryStreamにファイルストリームをコピーします。このようにして、HttpContentを破棄してもFileStreamは閉じられません。 2番目の呼び出しを行うには、ストリームポインタの位置を変更し、新しいStreamContentを作成する必要があります。

+0

streamContent.CopyToAsyncを使用するか、streamContent.LoadIntoBufferAsyncを呼び出す必要がありますか? – zarkobehar

+1

CopyToAsyncのメソッドは機能しますが、問題はこのストリームのメモリ使用量を2倍にすることです。問題はFileStreamだとは思わない。私はContentStreamとしてMemoryStreamを渡すために批判しましたが、それでも処分されています。私がLoadIntoBufferAsyncを呼び出すと何も変わらない... – zarkobehar

関連する問題