4

WebApi を介して Sql Server から BLOB データをストリーミングする必要があります。

Web サーバーのメモリに BLOB データをバッファリングしたくありません。

次のコードがありますが、機能しません - 例外はありません。

public class AttachmentController : ApiController
{
    public async Task<HttpResponseMessage> Get(int id)
    {
        using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
        {
            await connection.OpenAsync();

            using (var command = new SqlCommand("SELECT Content FROM [Attachments] WHERE ID = @ID", connection))
            {

                command.Parameters.AddWithValue("ID", id);

                using (SqlDataReader reader = await command.ExecuteReaderAsync(CommandBehavior.SequentialAccess))
                {

                    if (await reader.ReadAsync())
                    {
                        using (Stream data = reader.GetStream(0))
                        {
                            var response = new HttpResponseMessage{Content = new StreamContent(data)};
                            //I get this from the DB else where
                            //response.Content.Headers.ContentType = new MediaTypeHeaderValue(attachment.ContentType);
                            //I get this from the DB else where
                            //response.Content.Headers.ContentLength = attachment.ContentLength;
                            return response;

                        }
                    }
                }
            }

            throw new HttpResponseException(HttpStatusCode.NotFound);
        }
    }
}

Fiddle は、応答として次のエラーを書き込みます: [Fiddler] ReadResponse() failed: The server did not return a response for this request.

コンテンツをメモリにバッファリングせずに、DB から http 出力ストリームにストリーミングするにはどうすればよいですか?

4

1 に答える 1

1

ASP.NET MVC がストリームからの読み取りを完了する前に、ストリームを閉じようとしています。returnステートメントが実行された直後に発生するさまざまな using ブロックを離れると、閉じられます。

これを達成する簡単な方法がないことを私は知っています。最良のアイデアはStream、ADO.NET によって返されたストリームをラップするカスタム派生クラスを作成し、ストリームが使い果たされるとすべて ( Stream、リーダー、コマンド、および接続) を破棄することです。

この解決策は、ブロックなどを使用できないことを意味します。私は本当にそれが好きではありませんが、現時点ではもっと良いものは考えられません. 要件を組み合わせることは困難です。ストリーミング動作が必要で、開いたさまざまなリソースを破棄する必要があります。

于 2013-08-17T18:39:46.017 に答える