2013-08-30 5 views
0

나는 Azure blob에서 다운로드하기 위해 SAS 키를 사용하고 있습니다. 웹 역할 인스턴스에서 BLOB를 하늘 저장소에서 스트리밍 한 다음 브라우저로 직접 스트리밍합니다. 그것은 작은 파일에 잘 작동하지만 내가 (이 경우 1.7GB)를 큰 파일을 다운로드하려고 할 때, 나는 다음과 같은 StorageException 수 :푸른 하늘에서 다운로드 할 때 "전송 연결에서 데이터를 읽을 수 없습니다 : 연결이 닫혔습니다."라는 메시지가 나타납니다.

try 
{ 
    Blob = new Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob(new Uri(BlobSasUri)); 

    httpResponse.Clear(); 
    httpResponse.ClearHeaders(); 
    httpResponse.ClearContent(); 
    httpResponse.BufferOutput = false; 
    httpResponse.ContentType = Utilities.GetMIMEType(FileName); 
    string contentDisposition; 
    var browser = context.HttpContext.Request.Browser.Browser; 
    var version = context.HttpContext.Request.Browser.Version; 

    if (browser == "IE" && (version == "7.0" || version == "8.0" || version == "9.0")) 
     contentDisposition = "attachment; filename=" + Uri.EscapeDataString(FileName); 
    else if (browser == "Safari") 
     contentDisposition = "attachment; filename=" + FileName; 
    else 
    { 
     // Android Chrome browser unable to use UTF-8 encoding 
     if (Regex.IsMatch(context.HttpContext.Request.UserAgent, @"Android") && 
      Regex.IsMatch(context.HttpContext.Request.UserAgent, @"Chrome")) 
     { 
      contentDisposition = "attachment; filename=" + Uri.EscapeDataString(FileName).Replace("'", Uri.HexEscape('\'')); 
     } 
     else 
     { 
      // This is RFC5987 format, specifying use of utf-8. Apostrophes must be encoded for Chrome. 
      contentDisposition = "attachment; filename*=UTF-8''" + 
           Uri.EscapeDataString(FileName).Replace("'", Uri.HexEscape('\'')); 
     } 
    } 

    httpResponse.AddHeader("Content-Disposition", contentDisposition); 
    httpResponse.AddHeader("Content-Length", eBFile.FileSize.ToString(CultureInfo.InvariantCulture)); 

    Blob.DownloadToStream(
     httpResponse.OutputStream 
    ); 

    // More gracefully ends the http request 
    httpApp.CompleteRequest(); 
} 
catch (Exception ex) 
{ 
    throw ex; 
} 
: 여기
{Microsoft.WindowsAzure.Storage.StorageException: Unable to read data from the transport connection: The connection was closed. ---> System.IO.IOException: Unable to read data from the transport connection: The connection was closed. 
    at System.Net.ConnectStream.EndRead(IAsyncResult asyncResult) 
    at Microsoft.WindowsAzure.Storage.Core.Util.StreamExtensions.WriteToSync(Stream stream, Stream toStream, Nullable`1 maxLength, Nullable`1 expiryTime, Boolean calculateMd5, Boolean syncRead, OperationContext operationContext, StreamDescriptor streamCopyState) 
    at Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync[T](StorageCommandBase`1 cmd, IRetryPolicy policy, OperationContext operationContext) 
    --- End of inner exception stack trace --- 
    at Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync[T](StorageCommandBase`1 cmd, IRetryPolicy policy, OperationContext operationContext) 
    at Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob.DownloadRangeToStream(Stream target, Nullable`1 offset, Nullable`1 length, AccessCondition accessCondition, BlobRequestOptions options, OperationContext operationContext) 

내 호출 코드를

하늘색 라이브러리 스트림이 조기에 중단 될 수있는 원인에 대한 아이디어가 있습니까? 내 다운로드 속도는 괜찮은 30Mbps입니다. 매우 감사!

답변

0

CloudBlockBlob.DownloadToStream() 메서드에 대해 "timeout"값 (지금은 20 분)을 지정하여이를 해결할 수있었습니다.

관련 문제