在与HttpClient进行PostAsync之后处理对象

时间:2013-06-04 12:45:50

标签: .net asp.net-mvc-3 dotnet-httpclient

我正在尝试使用HttpClient发送文件,如果接收端的某些内容失败,我想重新发送相同的文件流。

我正在使用包含流的MultipartFormDataContent创建一个post请求。 当我第一次调用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 });
    }

1 个答案:

答案 0 :(得分:0)

如果在Content对象上调用LoadIntoBufferAsync,它会将文件流复制到StreamContent对象内的内存流中。这样,处理HttpContent不应该关闭FileStream。您需要重新定位流指针并创建一个新的StreamContent以进行第二次调用。