2017-03-25 11 views
-1

を使用してストリームオブジェクトを作成する#私はS3のファイルをダウンロードするための一つの方法を持っているC声明

方法

Public ActionResult download(string filename, string credentials) 
{ 
    .... 
    Using(stream res = response from s3) 
    { 
     return file(res, type, filename); 
    } 
} 

しかし、例外は、上記の方法を実行する上で投げています。

例外メッセージ - 要求が中止されました:接続が予期せず

閉鎖された私は、ダウンロードした後、ストリーム「RES」オブジェクトを解放しなければなりません。

+0

s3'から '応答とは何ですか? – DavidG

+0

サイズが50 mbのZipファイル – anand

+0

いいえ、いいえ、いいえ、メソッド/関数/オブジェクト/データ型は何ですか? – DavidG

答えて

1

ActionResultを返すためFile方法の場合、あなたはアクションの結果にストリームを閉じるための責任を転送なので、確かにあなたがDisposeを呼び出すか、usingを使用する必要はありません。これは、ActionResultがデータをバッファリングする必要がないようにするためです。だから、:ちょうどusingを取る:

public ActionResult Download(string filename, string credentials) 
{ 
    .... 
    var res = /* response from s3 */ 
    return File(res, type, filename); 
} 

あなたは非自明なコードがある場合、あなたはそれをより複雑にすることができます。

public ActionResult Download(string filename, string credentials) 
{ 
    .... 
    Stream disposeMe = null; 
    try { 
     // ... 
     disposeMe = /* response from s3 */ 
     // ... 
     var result = File(disposeMe, type, filename);  
     disposeMe = null; // successfully created File result which 
         // now owns the stream, so *leave stream open* 
     return result; 
    } finally { 
     disposeMe?.Dispose(); // if not handed over, dispose 
    } 
} 
+0

ストリーム 'res'オブジェクトを閉じるときに 'File'メソッドが不要になったとき – anand

+0

yes;このアプローチでは、生涯/所有権をアクション結果に移しています –