IOException при загрузке в хранилище BLOB-объектов в опубликованном приложении - PullRequest
5 голосов
/ 02 октября 2019

Я разработал простое приложение, которое просто должно загружать файлы из папки в хранилище BLOB-объектов Azure. Я отлично запускаюсь при запуске из VS, но в опубликованном приложении я иногда получаю эту ошибку:

ved System.IO .__ Ошибка, Int32 bufferSize, параметры FileOptions, SECURITY_ATTRIBUTES secAttrs, строка msgPath, логическое значение bFromProxy, логическое значение useLongPath, логическое значение checkHost) ved System.IO.FileStream..ctor (строковый путь, режим FileMode, доступ к FileAccess) ved Microsoft.WindowsAlob. CloudBlockBlob.UploadFromFile (путь строки, режим FileMode, AccessCondition accessCondition, параметры BlobRequestOptions, OperationsContext operationContext) ved Program.MainWindow.Process (отправитель объекта, NotifyCollectionChangedEventArgs e)

этот код выглядит для загрузки1007 *

private void Process(object sender, NotifyCollectionChangedEventArgs e)
{
    if (paths.Count > 0){
        var currentPath = paths.Dequeue();
        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(UserSettings.Instance.getConnectionString());
        CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
        CloudBlobContainer blobContainer = blobClient.GetContainerReference(UserSettings.Instance.getContainer());
        CloudBlockBlob b = blobContainer.GetBlockBlobReference(System.IO.Path.GetFileName(currentPath));
        try
        {
           b.UploadFromFile(currentPath, FileMode.Open);
        }
        catch (StorageException s)
        {
            throw new System.InvalidOperationException("Could not connect to the specified storage account. Please check the configuration.");
        }
        catch (IOException exc)
        {
            throw new System.InvalidOperationException(exc.StackTrace);
        }
    }
}

ЭтоIOException в улове, который срабатывает время от времени, есть идеи, как это исправить?

Если я просматриваю документы, я просто получаю информацию, что исключение происходит, если произошла ошибка службы хранилища. Любая идея, как исследовать дальше?

https://docs.microsoft.com/en-us/java/api/com.microsoft.azure.storage.blob._cloud_blob.uploadfromfile?view=azure-java-legacy#com_microsoft_azure_storage_blob__cloud_blob_uploadFromFile_final_String_

Ответы [ 2 ]

1 голос
/ 10 октября 2019

Я заметил, что ошибка возникает только тогда, когда я копирую файлы в контролируемую папку, если я перетаскиваю их, все работает нормально?

Похоже, ваше приложение пытаетсячитать локальные файлы, которые все еще записываются на диск (не полностью) или заблокированы другими процессами. Перетаскивание файлов - это «атомарные» операции (то есть очень быстрые), что значительно снижает вероятность получения этой ошибки.

Попробуйте реализовать метод из этого ответа , чтобы проверить, не является ли файл 'заблокирован до звонка UploadFromFile(). Теперь, в зависимости от вашей логики кода, вам потребуется реализовать некоторую форму «повторных попыток», если файл заблокирован. Вот пример:

    protected virtual bool IsFileLocked(FileInfo file)
    {
        FileStream stream = null;

        try
        {
            stream = file.Open(FileMode.Open, FileAccess.Read, FileShare.None);
        }
        catch (IOException)
        {
            //the file is unavailable because it is:
            //still being written to
            //or being processed by another thread
            //or does not exist (has already been processed)
            return true;
        }
        finally
        {
            if (stream != null)
                stream.Close();
        }

        //file is not locked
        return false;
    }

    private void Process(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (paths.Count > 0)
        {
            var currentPath = paths.Dequeue();
            CloudStorageAccount storageAccount = CloudStorageAccount.Parse(UserSettings.Instance.getConnectionString());
            CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
            CloudBlobContainer blobContainer = blobClient.GetContainerReference(UserSettings.Instance.getContainer());
            CloudBlockBlob b = blobContainer.GetBlockBlobReference(System.IO.Path.GetFileName(currentPath));
            try
            {
                FileInfo fi = new FileInfo(currentPath);
                while (IsFileLocked(fi))
                    Thread.Sleep(5000); // Wait 5 seconds before checking again
                b.UploadFromFile(currentPath, FileMode.Open);
            }
            catch (StorageException s)
            {
                throw new System.InvalidOperationException("Could not connect to the specified storage account. Please check the configuration.");
            }
            catch (IOException exc)
            {
                throw new System.InvalidOperationException(exc.StackTrace);
            }
        }
    }

Обратите внимание, что это никоим образом не гарантирует, что файл не будет снова заблокирован другим процессом между вызовом IsFileLocked() и вызовом b.UploadFromFile().

0 голосов
/ 05 октября 2019

Обычно это происходит, когда отсутствует какой-либо файл, на который ссылается DotNet. У меня была эта ошибка, и когда я просверлил, я узнал, что navigationlevel.cs отсутствует. Кусок кода в фрагменте показывает значимость файла.

Он относится к фактическому исходному файлу и поэтому должен присутствовать. Когда источник недоступен или находится где-либо еще, ссылка на фрагмент этой страницы завершается ошибкой, и вы получите эту ошибку (именно поэтому она ссылается на файл .cs).

Если это не то же самоепроблема, это может быть связано с каким-то другим файлом, который отсутствует. Итак, попробуйте переустановить и перекомпилировать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...