1

別のサーバーからダウンロードされたファイルの圧縮リストを返すコントローラーを作成しています(同じデータセンターに配置されています)

私が今のところやったこと:

/// <summary>
/// Enables processing of the result of an action method by a custom type that inherits from the <see cref="T:System.Web.Mvc.ActionResult"/> class.
/// </summary>
/// <param name="context">The context in which the result is executed. The context information includes the controller, HTTP content, request context, and route data.</param>
public override void ExecuteResult(ControllerContext context)
{
    context.HttpContext.Response.ContentType = "application/zip";
    context.HttpContext.Response.CacheControl = "private";
    context.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
    context.HttpContext.Response.AddHeader("content-disposition", string.Format("attachment; filename=\"{0}\"", this.ResultFileName));

    var buffer = new byte[BufferSize];

    using (var zippedUploadStream = new ZipOutputStream(context.HttpContext.Response.OutputStream))
    {
        zippedUploadStream.SetLevel(0);

        foreach (var url in this.Urls)
        {
            var request = WebRequest.Create(url);
            var response = request.GetResponse();
            var downloadStream = response.GetResponseStream();

            if (downloadStream != null)
            {
                var zipEntry = new ZipEntry(Path.GetFileName(response.ResponseUri.ToString()));
                zippedUploadStream.PutNextEntry(zipEntry);

                int read;
                while ((read = downloadStream.Read(buffer, 0, buffer.Length)) > 0)
                {
                    zippedUploadStream.Write(buffer, 0, read);
                    context.HttpContext.Response.Flush();
                }
            }

            if (!context.HttpContext.Response.IsClientConnected)
            {
                break;
            }
        }

        zippedUploadStream.Finish();
    }

    context.HttpContext.Response.Flush();
    context.HttpContext.Response.End();
}

私が怖いのは、すべての操作が同期していることです。

この実装をやめた場合、パフォーマンスはどの程度低下しますか?

別のスレッドから context.HttpContext.Response オブジェクトにアクセスすることは可能ですか?

このコードは、非同期呼び出しを使用して最適化できますか?

4

1 に答える 1

0

Web 要求スレッド内からこのようなタスクを実行することは本当に望ましくありません。このような長時間実行され、システム リソースを大量に消費するタスクは、ある種のキューイングまたはメッセージ バス システムを使用して実行するのが最適です。このタスクを達成するには、 NServiceBusのようなものをお勧めします。単一の Web 要求スレッド内から複数の Web 要求を同期的に作成する代わりに、NServiceBus を使用してメッセージをキューに入れます。次に、NServiceBus はこれらのメッセージのそれぞれを取得し (構成によっては非同期の可能性があります)、それらを個別に処理します。これのボーナスは、NServiceBus がメッセージ キューとして使用する MSMQ の信頼性と耐久性の利点を得ることです。

于 2012-11-10T04:52:04.173 に答える