1

ファイルをクライアントにストリーミングするために使用しているコードで、奇妙な動作が発生しています。ファイルストアとして機能する 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();
    }

誰かがこの問題に光を当てることができれば、私はとても感謝しています!

4

0 に答える 0