2013-06-04 2 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

Если вы звоните LoadIntoBufferAsync на объект контента будет копировать файловый поток в MemoryStream внутри объекта StreamContent. Таким образом, удаление HttpContent не должно закрывать FileStream. Вам нужно будет переместить указатель потока и создать новый StreamContent для совершения второго вызова.

+0

Должен ли я использовать streamContent.CopyToAsync, или я должен просто вызвать streamContent.LoadIntoBufferAsync? – zarkobehar

+1

Метод с CopyToAsync работает, но проблема в том, что я удвою использование памяти для этого потока. Я не думаю, что проблема в FileStream. Я попытался передать параметр MemoryStream в качестве параметра содержимого, и он все еще существует. Когда я вызываю LoadIntoBufferAsync, ничего не меняется ... – zarkobehar

Смежные вопросы