【问题标题】:System.IO.IOException: Cannot close stream until all bytes are writtenSystem.IO.IOException:在写入所有字节之前无法关闭流
【发布时间】:2012-01-15 20:04:46
【问题描述】:

我正在使用以下代码将文件发送到外部服务..它适用于小文件,但会抛出 IOException 大文件..

FileStream newStream = File.OpenRead(_fullFilePath);
MemoryStream storeStream = new MemoryStream();
storeStream.SetLength(newStream.Length);
newStream.Read(storeStream.GetBuffer(), 0, (int)newStream.Length);
storeStream.Flush();
//send data to external service
newStream.Close();
storeStream.Close();

这似乎与我调用制作流的方式有关..但我找不到确切的解决方案..下面给出了错误详细信息

System.Net.WebException:请求被中止:请求被取消。 ---> System.IO.IOException:在写入所有字节之前无法关闭流。 在 System.Net.ConnectStream.CloseInternal(布尔内部调用,布尔中止) --- 内部异常堆栈跟踪结束 --- 在 System.Net.ConnectStream.CloseInternal(布尔内部调用,布尔中止) 在 System.Net.ConnectStream.System.Net.ICloseEx.CloseEx(CloseExState closeState) 在 System.Net.ConnectStream.Dispose(布尔处理) 在 System.IO.Stream.Close() 在 DotNetOpenAuth.Messaging.MessagingUtilities.PostMultipartNoGetResponse(HttpWebRequest request, IDirectWebRequestHandler requestHandler, IEnumerable`1 部分) 在 c:\Users\andarno\git\dotnetopenid\src\DotNetOpenAuth\Messaging\MessagingUtilities.cs:line 243 在 DotNetOpenAuth.OAuth.ChannelElements.OAuthChannel.InitializeRequestAsAuthHeader(IDirectedProtocolMessage requestMessage) 在 c:\Users\andarno\git\dotnetopenid\src\DotNetOpenAuth\OAuth\ChannelElements\OAuthChannel.cs:line 373 在 DotNetOpenAuth.OAuth.ChannelElements.OAuthChannel.CreateHttpRequest(IDirectedProtocolMessage 请求) 在 c:\Users\andarno\git\dotnetopenid\src\DotNetOpenAuth\OAuth\ChannelElements\OAuthChannel.cs:line 214 在 c:\Users\andarno\git\dotnetopenid\src\DotNetOpenAuth\OAuth\ConsumerBase.cs:line 132 在 C:\Users\Nick Bruun\Code\drei\23-api-dotnet\src\Implementations\ApiProvider.cs:line 137 中的 Visual.ApiProvider.DoRequest(MessageReceivingEndpoint 消息,List`1 参数) 在 C:\Users\Nick Bruun\Code 中的 Visual.PhotoService.Upload(String filename, String fileContentType, Stream filestream, Nullable`1 userId, Nullable`1 albumId, String title, String description, String tags, Nullable`1 publish) \drei\23-api-dotnet\src\Implementations\PhotoService.cs:line 294 在 e:\Projects\videoWeb\usercontrols\UploadVideos.ascx.cs:line 138 中的 usercontrols_UploadVideos.Upload23Video(对象参数)

使用 Using 的新代码

using (FileStream newStream = File.OpenRead(_fullFilePath))
{
    newStream.Flush();
    using (MemoryStream storeStream = new MemoryStream())
    {
        storeStream.SetLength(newStream.Length);
        newStream.Read(storeStream.GetBuffer(), 0, (int)newStream.Length);
        storeStream.Flush();
        newStream.Close();
        //call to webservice
        storeStream.Close();
    }
}

【问题讨论】:

  • 您应该将流的创建封装在 using 语句中。
  • 禁用 Keep Alive 并在 Using.. 中添加了 FileStream 和 MemoryStream.. 但仍然收到错误.. Max request length is very high value..
  • 为什么要在内存中缓冲可能非常大的文件?您在哪里“将数据发送到外部设备”?
  • 该文件正在使用他们的 API 发送到视频托管服务 23video.com .. 23developer.com/api/photo-upload .. 该网络服务有一个 .NET 包装器 github.com/23/23-api-dotnet 接受文件作为流..

标签: c# asp.net stream filestream ioexception


【解决方案1】:

你得到这个的原因是目标没有配置为允许这么大的文件。您必须调整目的地的最大请求长度的配置。

【讨论】:

  • 例如:
  • 或者你的源文件被另一个进程打开并锁定;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 2015-05-04
  • 1970-01-01
  • 2013-09-25
  • 2010-09-20
相关资源
最近更新 更多