19

ASP.NET webapi で、一時ファイルをクライアントに送信します。ストリームを開いてファイルを読み取り、HttpResponseMessage で StreamContent を使用します。クライアントがファイルを受信したら、この一時ファイルを削除したい (クライアントからの他の呼び出しなし) クライアントがファイルを受信すると、HttpResponseMessage の Dispose メソッドが呼び出され、ストリームも破棄されます。ここで、一時ファイルも削除したいと思います。

これを行う 1 つの方法は、HttpResponseMessage クラスからクラスを派生させ、Dispose メソッドをオーバーライドし、このファイルを削除して、基本クラスの dispose メソッドを呼び出すことです。(まだ試していないので、これがうまくいくかどうかはわかりません)

これを達成するためのより良い方法があるかどうか知りたいです。

4

3 に答える 3

15

DeleteOnClose オプションを持つ FileStream から StreamContent を作成します。

return new HttpResponseMessage(HttpStatusCode.OK)
{
    Content = new StreamContent(
        new FileStream("myFile.txt", FileMode.Open, 
              FileAccess.Read, FileShare.None, 4096, FileOptions.DeleteOnClose)
    )
};
于 2016-09-21T07:03:30.193 に答える
4

最初にファイルをバイト[]に読み込み、ファイルを削除してから応答を返すことでそれを行いました:

        // Read the file into a byte[] so we can delete it before responding
        byte[] bytes;
        using (var stream = new FileStream(path, FileMode.Open))
        {
            bytes = new byte[stream.Length];
            stream.Read(bytes, 0, (int)stream.Length);
        }
        File.Delete(path);

        HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
        result.Content = new ByteArrayContent(bytes);
        result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
        result.Content.Headers.Add("content-disposition", "attachment; filename=foo.bar");
        return result;
于 2015-02-03T20:04:54.833 に答える