.net 使用FileStreamResult,MemoryStream是如何关闭的?
下面的代码可以工作,但我想知道创建的.net 使用FileStreamResult,MemoryStream是如何关闭的?,.net,asp.net-mvc-3,memorystream,filestreamresult,.net,Asp.net Mvc 3,Memorystream,Filestreamresult,下面的代码可以工作,但我想知道创建的MemoryStream是否正确关闭。这应该如何执行,或者FileStreamResult是否为我处理 public FileStreamResult DownloadBudgetedRoleOpportunities( Guid projectGuid, IEnumerable<Guid> guidRequiredRoles) { var rolebroker = new ProjectRoleBudgetBroker(
MemoryStream
是否正确关闭。这应该如何执行,或者FileStreamResult
是否为我处理
public FileStreamResult DownloadBudgetedRoleOpportunities(
Guid projectGuid,
IEnumerable<Guid> guidRequiredRoles)
{
var rolebroker = new ProjectRoleBudgetBroker();
var memstream = rolebroker.CreateBudgetedRoleOpportunies(
projectGuid,
guidRequiredRoles);
var fsr = new FileStreamResult ( memstream, "application/csv" )
{
FileDownloadName = "RoleOpportunities.csv"
};
// memstream.Close(); throws exception
return fsr;
}
public FileStreamResult下载预算角色机会(
Guid项目Guid,
IEnumerable guidRequiredRoles)
{
var rolebroker=newprojectrolebudgetbroker();
var memstream=rolebroker.CreateBudgetedRoleOpportunies(
projectGuid,
guidRequiredRoles);
var fsr=new FileStreamResult(memstream,“应用程序/csv”)
{
FileDownloadName=“RoleOpportunities.csv”
};
//memstream.Close();引发异常
返回fsr;
}
文件流结果将为您执行此操作。如果有疑问,请始终检查代码,因为代码从不说谎,而且ASP.NET MVC是开源的,因此查看代码更容易
通过在Google上快速搜索FileStreamResult.cs,您可以验证在WriteFile
方法中,是否使用using
语句正确地处理了流。(没有双关语)
您可以访问源代码,因此可以检查自己;-)
protected override void WriteFile(HttpResponseBase response) {
// grab chunks of data and write to the output stream
Stream outputStream = response.OutputStream;
using (FileStream) {
byte[] buffer = new byte[_bufferSize];
while (true) {
int bytesRead = FileStream.Read(buffer, 0, _bufferSize);
if (bytesRead == 0) {
// no more data
break;
}
outputStream.Write(buffer, 0, bytesRead);
}
}
}
protected override void WriteFile(HttpResponseBase response)
{
Stream outputStream = response.OutputStream;
using (this.FileStream)
{
byte[] buffer = new byte[4096];
while (true)
{
int count = this.FileStream.Read(buffer, 0, 4096);
if (count != 0)
outputStream.Write(buffer, 0, count);
else
break;
}
}
}