構成を説明する上記のリンクに加えて、TransmitFileを使用してファイルを「ストリーミング」することができます。ただし、TransmitFileには、一部のhttpクライアントで逆方向があります。
これは、TransmitFileの代わりに、ファイルをクライアントに「ストリーミング」するための私のコードです。WriteFileでロールバックする構成定数があることに注意してください(これはあなたと同じOutOfMemoryの問題があります):
private void RenderContent(string contentType,string fileName, bool inline);
メソッドコード:
FileInfo fi = new FileInfo(fileName);
Response.ClearHeaders();
Response.ClearContent();
Response.ContentType = contentType;
Response.CacheControl = "No-cache";
Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache);
Response.AddHeader("Content-Length", fi.Length.ToString());
Response.AddHeader("Content-Disposition", (inline ? "inline" : "attachment") + "; filename=\"" + fi.Name + "\"");
if (cAppInfos.Constant["FallBackToWriteFile"] != null && cAppInfos.Constant["FallBackToWriteFile"] == "true")
{
Response.WriteFile(fileName);
}
else
{
int chunkSize = 8192;
byte[] buffer = new byte[chunkSize];
int offset = 0;
int read = 0;
using (FileStream fs = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.Read))
{
while ((read = fs.Read(buffer, offset, chunkSize)) > 0)
{
if (!Response.IsClientConnected)
break;
Response.OutputStream.Write(buffer, 0, read);
Response.Flush();
}
}
}
このコードを使用して、古いacrobatリーダープラグインにPDFファイルをストリーミングする際の問題を回避しました。インラインパラメータには、「false」を使用できます。
さらに、Response.IsClientConnecter / Write / Flushのいずれかがクライアントの切断時に例外をスローする可能性があるため、このコードの周りでtry/catchを使用できます。
ただし、私はMVCを使用しておらず、TransmitFileを使用していない場合と同じように、このテクノでこれが受け入れられるかどうかはわかりません。このコードでも同じ問題が発生する可能性があります。ファイルをWebページ要素に埋め込もうとしている場合(base64のように?)、これは解決策ではありません。
目標を達成するために他の方法が必要な場合は、要件について詳しく教えてください。