Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# FileStreamResult vs FileContentResult_C#_.net_Memorystream - Fatal编程技术网

C# FileStreamResult vs FileContentResult

C# FileStreamResult vs FileContentResult,c#,.net,memorystream,C#,.net,Memorystream,我有办法 public virtual FileContentResult DownloadUserFileTemplate() { var dataRow = new DataRow { RowItems = new List<string> { "Name", "Email", "Roles" } }; var templateFileInMemoryStream = documentHandler.CsvDocumentCreator.C

我有办法

public virtual FileContentResult DownloadUserFileTemplate()
{
    var dataRow = new DataRow { RowItems = new List<string> { "Name", "Email", "Roles" } };            
    var templateFileInMemoryStream = documentHandler.CsvDocumentCreator.Create(new List<DataRow> { dataRow }); //CsvDocumentCreator.Create method create stream object in using block and returns it.
    return File(templateFileInMemoryStream.ToArray(), "text/csv", "UserImportSheet.csv");
}
public虚拟文件contentresult DownloadUserFileTemplate()
{
var dataRow=new dataRow{RowItems=new List{“Name”、“Email”、“Roles”};
var templateFileInMemoryStream=documentHandler.CsvDocumentCreator.Create(新列表{dataRow});//CsvDocumentCreator.Create方法在using块中创建流对象并返回它。
返回文件(templateFileInMemoryStream.ToArray(),“text/csv”,“UserImportSheet.csv”);
}
正如我们所知,FileStreamResult也存在。因此,如果我将上述代码重构为:

public virtual FileStreamResult DownloadUserFileTemplate()
{          
    var dataRow = new DataRow { RowItems = new List<string> { "Name", "Email", "Roles" } };
    var templateFileInMemoryStream = documentHandler.CsvDocumentCreator.Create(new List<DataRow> { dataRow });
    return File(templateFileInMemoryStream, "text/csv", "UserImportSheet.csv");
}
公共虚拟文件流Result DownloadUserFileTemplate()
{          
var dataRow=new dataRow{RowItems=new List{“Name”、“Email”、“Roles”};
var templateFileInMemoryStream=documentHandler.CsvDocumentCreator.Create(新列表{dataRow});
返回文件(templateFileInMemoryStream、“text/csv”、“UserImportSheet.csv”);
}
当我尝试使用上面的方法下载文件时,它抛出一个异常,即流已经关闭。异常发生在return语句之后的某个地方,因为上述方法不会引发任何异常。有什么想法吗

这是我的CsvDocumentCreator.Create()方法:

公共内存流创建(IList行)
{
rows.IsNotNull(“rows”);
var builder=新的StringBuilder();
foreach(行中的变量行)
{
foreach(行中的var rowItem.RowItems)
{
Append(MakeValueCsvFriendly(rowItem)).Append(“,”);
}
Remove(builder.Length-1,1.AppendLine();
}
返回GenerateStream(builder.ToString());
}
私有静态MemoryStream GenerateStream(字符串值)
{
使用(var stream=new MemoryStream())
{
使用(var writer=新的StreamWriter(流))
{
writer.Write(值);
回流;
}
}
}

看起来应该能用。这是实际的代码吗?您没有使用块将
templateFileInMemoryStream
包装在
内存流中吗?是的,我正在使用块包装它,但我不确定它在什么时候处置/关闭内存流,因为它在执行action方法后抛出异常。由于使用块写入内存流始终是一种很好的做法,所以不确定我们为什么要这样做获取FileStreamResult,因为memorystream将在此步骤之前关闭。在上面添加了更多代码以进一步详细说明。请注意,
使用调用
Dispose
:此类型实现IDisposable接口。使用完该类型后,应直接或间接处置它。要直接处理该类型,请在try/catch块中调用其dispose方法。要间接地处理它,使用语言构造(例如使用外部库中的代码)是错误的,因为它过早地处理对象:对象仍将被使用。
 public MemoryStream Create(IList<DataRow> rows)
            {
                rows.IsNotNull("rows");

                var builder = new StringBuilder();

                foreach (var row in rows)
                {
                    foreach (var rowItem in row.RowItems)
                    {
                        builder.Append(MakeValueCsvFriendly(rowItem)).Append(",");
                    }

                    builder.Remove(builder.Length - 1, 1).AppendLine();
                }

                return GenerateStream(builder.ToString());
            }



private static MemoryStream GenerateStream(string value)
    {
        using (var stream = new MemoryStream())
        {
            using (var writer = new StreamWriter(stream))
            {
                writer.Write(value);
                return stream;
            }
        }
    }