0

ファイルのアップロードとダウンロードに WCF を使用しています。そして、私はダウンロードのために以下を使用しています。

try
        {
            MyService.IWITSService clientDownload = new WITSServiceClient();
            MyService.DownloadRequest requestData = new DownloadRequest();
            MyService.RemoteFileInfo fileInfo = new RemoteFileInfo();
            requestData.ItemID = Convert.ToInt32(Request.QueryString["id"]);

            fileInfo = clientDownload.DownloadFile(requestData);

            Response.BufferOutput = false;   // to prevent buffering 
            byte[] buffer = new byte[6500000];
            int bytesRead = 0;

            HttpContext.Current.Response.Clear();
            HttpContext.Current.Response.ClearHeaders();
            HttpContext.Current.Response.ContentType = fileInfo.FileExt;
            HttpContext.Current.Response.AddHeader("Content-Disposition","attachment; filename=" + fileInfo.FileName);

            bytesRead = fileInfo.FileByteStream.Read(buffer, 0, buffer.Length);

            while (bytesRead > 0)
            {
                // Verify that the client is connected.
                if (Response.IsClientConnected)
                {

                    Response.OutputStream.Write(buffer, 0, bytesRead);
                    // Flush the data to the HTML output.
                    Response.Flush();

                    buffer = new byte[6500000];
                    bytesRead = fileInfo.FileByteStream.Read(buffer, 0, buffer.Length);

                }
                else
                {
                    bytesRead = -1;
                }
            }
        }
        catch (Exception ex)
        {
            // Trap the error, if any.
            System.Web.HttpContext.Current.Response.Write("Error : " + ex.Message);
        }
        finally
        {
            Response.Flush();
            Response.Close();
            Response.End();
            System.Web.HttpContext.Current.Response.Close();
        }

ファイルはダウンロードされますが、ファイル データは表示されません。ファイルサイズは実際のサイズと同じです。誰でも私が変更しなければならない場所で私を助けることができます..前もって感謝します..

4

1 に答える 1

0

Response.Close()どちらも呼び出したくありませんSystem.Web.HttpContext.Current.Response.Close()。クライアントへの接続を中断します。

HttpResponse.Close メソッドのドキュメントには次のように書かれています。

このメソッドは、クライアントへの接続を突然終了するものであり、通常の HTTP 要求処理用ではありません。このメソッドはリセット パケットをクライアントに送信します。これにより、サーバー、クライアント、またはその間のどこかにバッファリングされた応答データがドロップされる可能性があります。

悪意のある HTTP クライアントによる攻撃に対応して、このメソッドを使用する可能性があります。ただし、通常、EndRequest イベントにジャンプしてクライアントに応答を送信する場合は、代わりに CompleteRequest を呼び出す必要があります。

したがって、finallyコードを次のように減らします。

finally
{
    Response.Flush();
    Response.End();
}
于 2013-01-02T09:53:34.963 に答える