ファイルをクライアントにストリーミングするために使用しているコードで、奇妙な動作が発生しています。ファイルストアとして機能する mssql サーバーがあり、UNC パス経由でアクセスされるファイルがあります。
私の Web サーバーでは、クライアントへのファイル (この場合は写真とサムネイル) のストリーミングを処理する .net コードが実行されています。
私のコードは機能しますが、最初のファイル要求で約 12 秒の一定の遅延が発生しています。私が最初のリクエストを行ったとき、それはサーバーが起動し、突然応答するようになり、しばらくしてから同じ動作にフォールバックするためです。
最初は自分のコードだと思っていましたが、サーバー アクティビティ ログを見ると、リソースを大量に消費するコードは実行されていません。私の理論では、サーバーへの呼び出しごとにパスを最初にマウントする必要があり、それが遅延の原因です。その後、しばらくしてマウントが解除され、再マウントする必要があります。
参考のために、私は自分のコードを投稿しています(問題が見えないだけかもしれません):
public async static Task StreamFileAsync(HttpContext context, FileInfo fileInfo)
{
//This controls how many bytes to read at a time and send to the client
int bytesToRead = 512 * 1024; // 512KB
// Buffer to read bytes in chunk size specified above
byte[] buffer = new Byte[bytesToRead];
// Clear the current response content/headers
context.Response.Clear();
context.Response.ClearHeaders();
//Indicate the type of data being sent
context.Response.ContentType = FileTools.GetMimeType(fileInfo.Extension);
//Name the file
context.Response.AddHeader("Content-Disposition", "filename=\"" + fileInfo.Name + "\"");
context.Response.AddHeader("Content-Length", fileInfo.Length.ToString());
// Open the file
using (var stream = fileInfo.OpenRead())
{
// The number of bytes read
int length;
do
{
// Verify that the client is connected
if (context.Response.IsClientConnected)
{
// Read data into the buffer
length = await stream.ReadAsync(buffer, 0, bytesToRead);
// and write it out to the response's output stream
await context.Response.OutputStream.WriteAsync(buffer, 0, length);
try
{
// Flush the data
context.Response.Flush();
}
catch (HttpException)
{
// Cancel the download if a HttpException happens
// (ie. the client has disconnected by we tried to send some data)
length = -1;
}
//Clear the buffer
buffer = new Byte[bytesToRead];
}
else
{
// Cancel the download if client has disconnected
length = -1;
}
} while (length > 0); //Repeat until no data is read
}
// Tell the response not to send any more content to the client
context.Response.SuppressContent = true;
// Tell the application to skip to the EndRequest event in the HTTP pipeline
context.ApplicationInstance.CompleteRequest();
}
誰かがこの問題に光を当てることができれば、私はとても感謝しています!