2012-01-15 170 views
2

我使用下面的代码来发送文件到外部服务。它适用于小文件,但抛出IOException异常在大文件..System.IO.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: The request was aborted: The request was canceled. ---> System.IO.IOException: Cannot close stream until all bytes are written. 
    at System.Net.ConnectStream.CloseInternal(Boolean internalCall, Boolean aborting) 
    --- End of inner exception stack trace --- 
    at System.Net.ConnectStream.CloseInternal(Boolean internalCall, Boolean aborting) 
    at System.Net.ConnectStream.System.Net.ICloseEx.CloseEx(CloseExState closeState) 
    at System.Net.ConnectStream.Dispose(Boolean disposing) 
    at System.IO.Stream.Close() 
    at DotNetOpenAuth.Messaging.MessagingUtilities.PostMultipartNoGetResponse(HttpWebRequest request, IDirectWebRequestHandler requestHandler, IEnumerable`1 parts) in c:\Users\andarno\git\dotnetopenid\src\DotNetOpenAuth\Messaging\MessagingUtilities.cs:line 243 
    at DotNetOpenAuth.OAuth.ChannelElements.OAuthChannel.InitializeRequestAsAuthHeader(IDirectedProtocolMessage requestMessage) in c:\Users\andarno\git\dotnetopenid\src\DotNetOpenAuth\OAuth\ChannelElements\OAuthChannel.cs:line 373 
    at DotNetOpenAuth.OAuth.ChannelElements.OAuthChannel.CreateHttpRequest(IDirectedProtocolMessage request) in c:\Users\andarno\git\dotnetopenid\src\DotNetOpenAuth\OAuth\ChannelElements\OAuthChannel.cs:line 214 
    at DotNetOpenAuth.OAuth.ConsumerBase.PrepareAuthorizedRequest(MessageReceivingEndpoint endpoint, String accessToken, IEnumerable`1 binaryData) in c:\Users\andarno\git\dotnetopenid\src\DotNetOpenAuth\OAuth\ConsumerBase.cs:line 132 
    at Visual.ApiProvider.DoRequest(MessageReceivingEndpoint message, List`1 parameters) in C:\Users\Nick Bruun\Code\drei\23-api-dotnet\src\Implementations\ApiProvider.cs:line 137 
    at Visual.PhotoService.Upload(String filename, String fileContentType, Stream filestream, Nullable`1 userId, Nullable`1 albumId, String title, String description, String tags, Nullable`1 publish) in C:\Users\Nick Bruun\Code\drei\23-api-dotnet\src\Implementations\PhotoService.cs:line 294 
    at usercontrols_UploadVideos.Upload23Video(Object parameters) in e:\Projects\videoWeb\usercontrols\UploadVideos.ascx.cs:line 138 

新的代码给出使用

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(); 
    } 
} 
+4

你应该在'using'语句中包装流的创建。 – Oded 2012-01-15 20:06:47

+0

禁用保持活着并添加FileStream和MemoryStream里面使用..但仍然得到错误..最大请求长度是非常高的值.. – 2012-01-15 20:23:33

+0

为什么你缓冲内存中的潜在非常大的文件?你在哪里“将数据发送到外部设备”? – BrokenGlass 2012-01-15 20:25:57

回答

2

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

+0

例如:<结构> <的httpRuntime的maxRequestLength = “32768”/> Vaibhav 2016-06-08 12:14:28

相关问题