对象在 PostAsync 与 HttpClient 之后被释放
Posted
技术标签:
【中文标题】对象在 PostAsync 与 HttpClient 之后被释放【英文标题】:Object is disposed after PostAsync with HttpClient 【发布时间】:2013-06-04 12:45:50 【问题描述】:我正在尝试使用 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 );
【问题讨论】:
7 年后,我发现自己正处于那种境地……你是不是就碰巧记得你是如何解决它的? 【参考方案1】:如果您在 Content 对象上调用 LoadIntoBufferAsync,它会将文件流复制到 StreamContent 对象内的内存流中。这样,处理 HttpContent 不应关闭您的 FileStream。您将需要重新定位流指针并创建一个新的 StreamContent 以进行第二次调用。
【讨论】:
我应该使用 streamContent.CopyToAsync 还是只调用 streamContent.LoadIntoBufferAsync? 使用 CopyToAsync 的方法有效,但问题是我将为此流的内存使用量加倍。我认为问题不在于 FileStream。我已经将 MemoryStream 作为内容参数传递,但它仍在处理。当我调用 LoadIntoBufferAsync 时,什么都没有改变......以上是关于对象在 PostAsync 与 HttpClient 之后被释放的主要内容,如果未能解决你的问题,请参考以下文章
HttpClien高并发请求连接池 - PoolingHttpClientConnectionManager
HTTP 请求 PostAsync 与 HttpClient 取消请求或资源暂时不可用