別のサーバーからダウンロードされたファイルの圧縮リストを返すコントローラーを作成しています(同じデータセンターに配置されています)
私が今のところやったこと:
/// <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 オブジェクトにアクセスすることは可能ですか?
このコードは、非同期呼び出しを使用して最適化できますか?