9

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

1 に答える 1

0

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

于 2013-06-07T14:58:35.057 に答える