Странна внезапна грешка Броят байтове за запис е по-голям от зададената ContentLength

Качвам растерни изображения в Azure Blob Storage. Всичко работеше добре, но след това направих нов проект, за да използвам същия код, но сега постоянно получавам тази грешка „Броят байтове за запис е по-голям от указаната ContentLength“

Ето част от моя код memoryStream.Seek(0, SeekOrigin.Begin);

try
{
    cloudBlobContainer.GetBlockBlobReference(resourcename).UploadFromStream(memoryStream);

    return true;
}
catch (Exception exception)
{
    ReportHelper.Report(Tag, "Error occurred while uploading image " + imageQuality, true, exception, true);

    return null;
}

Проблемът е във функцията UploadFromStream, не знам защо вече не работи.

Този UploadFromStream се споменава в тази dll https://github.com/zgramana/IOSAzureBlobUploader/tree/master/lib, който е изграден от това решение https://github.com/zgramana/azure-sdk-for-net

Ето функцията UploadFromStream(), която се посочва от dll

/// <summary>
/// Uploads a stream to a block blob. 
/// </summary>
/// <param name="source">The stream providing the blob content.</param>
/// <param name="accessCondition">An <see cref="AccessCondition"/> object that represents the access conditions for the blob. If <c>null</c>, no condition is used.</param>
/// <param name="options">A <see cref="BlobRequestOptions"/> object that specifies any additional options for the request.</param>
/// <param name="operationContext">An <see cref="OperationContext"/> object that represents the context for the current operation.</param>
[DoesServiceRequest]
public void UploadFromStream(Stream source, AccessCondition accessCondition = null, BlobRequestOptions options = null, OperationContext operationContext = null)
{
    CommonUtils.AssertNotNull("source", source);
    this.attributes.AssertNoSnapshot();
    BlobRequestOptions modifiedOptions = BlobRequestOptions.ApplyDefaults(options, BlobType.BlockBlob, this.ServiceClient);
    operationContext = operationContext ?? new OperationContext();

    DateTime? expiryTime = modifiedOptions.MaximumExecutionTime.HasValue
        ? DateTime.Now + modifiedOptions.MaximumExecutionTime.Value
        : (DateTime?)null;

    if ((this.ServiceClient.ParallelOperationThreadCount == 1) &&
        source.CanSeek &&
        ((source.Length - source.Position) <= this.ServiceClient.SingleBlobUploadThresholdInBytes))
    {
        string contentMD5 = null;
        if (modifiedOptions.StoreBlobContentMD5.Value)
        {
            OperationContext tempOperationContext = new OperationContext();
            StreamDescriptor streamCopyState = new StreamDescriptor();
            long startPosition = source.Position;
            source.WriteToSync(Stream.Null, null /* maxLength */, expiryTime, true, true, tempOperationContext, streamCopyState);
            source.Position = startPosition;
            contentMD5 = streamCopyState.Md5;
        }

        Executor.ExecuteSync(
            this.PutBlobImpl(source, contentMD5, accessCondition, modifiedOptions),
            modifiedOptions.RetryPolicy,
            operationContext);
    }
    else
    {
        using (Stream blobStream = this.OpenWrite(accessCondition, modifiedOptions, operationContext))
        {
            source.WriteToSync(blobStream, null /* maxLength */, expiryTime, false, true, new OperationContext(), null /* streamCopyState */);
        }
    }
}

Проучвах с часове, опитвайки се да разбера как да поправя тази грешка, но не успях. Така или иначе НЕ задавам изрично стойността ContentLength (всъщност дори нямам достъп до нея, тъй като UploadFromStream го прави сам, вярвам)

Капацитетът на паметта е 2048 байта, дължината му е 1415 байта

Ето проследяването на стека на грешката

{Microsoft.WindowsAzure.Storage.StorageException: Броят байтове за запис е по-голям от указаната ContentLength. ---> System.Net.ProtocolViolationException: Броят на байтовете за запис е по-голям от указаната ContentLength. в System.Net.WebConnectionStream.CheckWriteOverflow (Int64 contentLength, Int64 totalWritten, Int64 size) [0x00000] в:0 в System.Net.WebConnectionStream.BeginWrite (System.Byte[] буфер, Int32 отместване, Int32 размер, System.AsyncCallback cb , състояние на System.Object) [0x00000] в :0 в System.Net.WebConnectionStream.Write (буфер System.Byte[], отместване на Int32, размер на Int32) [0x00000] в :0 в Microsoft.WindowsAzure.Storage.Core.Util .StreamExtensions.WriteToSync (System.IO.Stream поток, System.IO.Stream toStream, Nullable1 maxLength, Nullable1 expiryTime, Boolean calculateMd5, Boolean syncRead, Microsoft.WindowsAzure.Storage.OperationContext operationContext, Microsoft.WindowsAzure.Storage.Core.Util.StreamDescriptor streamCopyState) [0x00000] в:0 в Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync[NullType] (Microsoft.WindowsAzure.Storage.Core.Executor.StorageCommandBase1 cmd, IRetryPolicy policy, Microsoft.WindowsAzure.Storage.OperationContext operationContext) [0x00000] in <filename unknown>:0 --- End of inner exception stack trace --- at Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync[NullType] (Microsoft.WindowsAzure.Storage.Core.Executor.StorageCommandBase1 cmd, IRetryPolicy политика, Microsoft.WindowsAzure.Storage.OperationContext операция ionContext) [0x00000] в :0 в Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob.UploadFromStream (System.IO.Stream източник, Microsoft.WindowsAzure.Storage.AccessCondition accessCondition, Microsoft.WindowsAzure.Storage.Blob.BlobRequestOptions опции, Microsoft. WindowsAzure.Storage.OperationContext operationContext) [0x00000] в :0 в Client.Mobile.Droid.Source.Azure.AmsHelper+d__6.MoveNext () [0x0021b] в c:\testsolution\AmsHelper.cs:103 Информация за исканеRequestID:RequestDate: Съобщение за състоянието:}

Проверих контейнера за съхранение и потокът наистина се качва правилно и мога да видя изображението и всичко е наред, но по някаква причина получавам тази странна грешка.

Всяка помощ за коригиране на грешката ще бъде много оценена. Мога да предоставя всякаква информация при поискване.


person Dv_MH    schedule 02.06.2014    source източник


Отговори (1)


Все още не можах да разбера защо възниква грешката. Вероятно защото използвам една година остаряла разклонена библиотека за качване на петна, тази библиотека дори не е предназначена да поддържа платформата, която използвам от самото начало.

Както и да е, оказа се, че петната се качват доста добре, така че всичко, което трябва да направя, е да потисна тази грешка

try
{
    cloudBlobContainer.GetBlockBlobReference(resourcename).UploadFromStream(memoryStream);

    return true;
}
catch (Microsoft.WindowsAzure.Storage.StorageException storageException)
{
    return true;
}
catch (System.Net.ProtocolViolationException protocolViolationException)
{
    return true;
}
catch (Exception exception)
{
    ReportHelper.Report(Tag, "Error occurred while uploading image " + imageQuality, true, exception, true);

    return null;
}
person Dv_MH    schedule 05.06.2014