Список изменений Azure IListBlobItem Oftype CloudBlob Linq ‹CloudBlob›

На моей странице мне нужно искать контейнеры и большие двоичные объекты по имени, типу и LastModified.

 var selectedValue = ddlFileType.SelectedValue;
        AzureSettings container = AzureSettingsServices.Select(selectedValue.ParseInt(-1));
        if (ViewState[container.Name] == null)
        {
            IEnumerable<IListBlobItem> blobList = BlobHelper.GetFileListByContainer(container.Name);

            //I add the viewstate for not spending money in azure :)
            ViewState.Add(container.Name, blobList);

        }
         List<CloudBlob> list = null;
        string fileName = txtFileName.Text;
        if (!string.IsNullOrWhiteSpace(fileName))
        {
            //by name and date
            list = ((IEnumerable<IListBlobItem>)ViewState[container.Name]).OfType<CloudBlob>().Where(x => x.Name == fileName && x.Properties.LastModified >= dtDate.ValueRange.StartDate && x.Properties.LastModified <= dtDate.ValueRange.EndDate ).ToList();
        }
        else if (string.IsNullOrWhiteSpace(fileName))
        {
            //by date
            list = ((IEnumerable<IListBlobItem>)ViewState[container.Name]).OfType<CloudBlob>().Where(x => x.Properties.LastModified >= dtDate.ValueRange.StartDate && x.Properties.LastModified <= dtDate.ValueRange.EndDate ).ToList();
        }
        if (list != null)
        {
          // by type
            list=list.OfType<CloudBlob>().Where(x => x.Name.Contains(selectedValue)).ToList();

            SelectedContainer = container.Name;
            grdFiles.DataSource = list;
            grdFiles.DataBind();
        }

Проблема в том, что я не могу предоставить список List ‹CloudBlob> в качестве источника данных gridview, что является нормальным, но как я могу установить список List‹ CloudBlob> в ( IEnumerable ‹IListBlobItem> bloblist или в моем состоянии просмотра (примечание: в моем состоянии просмотра находится мой список Ilistblobitem) ) назад для моего источника данных gridview

ОШИБКА ОБНОВЛЕНИЯ 2:

grdFiles.DataSource = ((IEnumerable) ViewState [container.Name]);

grdFiles.DataBind ();

Вот ошибка о том,

'Microsoft.WindowsAzure.Storage, Version = 7.2.1.0, Culture = нейтральный, PublicKeyToken = 31bf3856ad364e35' Microsoft.WindowsAzure.Storage.Core.Util.CommonUtility + d__0`1 [[Microsoft.WindowsAzure.Storage.Blob.IListBlobItem, Microsoft .WindowsAzure.Storage, Version = 7.2.1.0, Culture = нейтральный, PublicKeyToken = 31bf3856ad364e35]] '

> [SerializationException: 'Microsoft.WindowsAzure.Storage, Version=7.2.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' Derlemesindeki 'Microsoft.WindowsAzure.Storage.Core.Util.CommonUtility+<LazyEnumerable>d__0`1[[Microsoft.WindowsAzure.Storage.Blob.IListBlobItem, Microsoft.WindowsAzure.Storage, Version=7.2.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]' ]

System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers (тип RuntimeType) +12207601 System.Runtime.Serialization.FormatterServices.GetSerializableMembers (тип типа, контекст StreamingContextinary) +230 System.Runtime.Serialization.

System. (Object obj, ISurrogateSelector surrogateSelector, контекст StreamingContext, SerObjectInfoInit serObjectInfoInit, преобразователь IFormatterConverter, ObjectWriter objectWriter, связыватель SerializationBinder) +51 System.Runtime.Serialization.Formatters.Binary.ObadersjectWriter, ObjectWriter___, Serialize fCheck) +540 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize (Stream serializationStream, граф объектов, заголовки Header [], логическое значение fCheck) +131 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize (Stream serializationStream , Граф объекта) +17 System.Web.UI.ObjectStateFormatter.SerializeValue (средство записи SerializerBinaryWriter, значение объекта) +3046

[ArgumentException: 'Microsoft.WindowsAzure.Storage.Core.Util.CommonUtility + d__01[[Microsoft.WindowsAzure.Storage.Blob.IListBlobItem, Microsoft.WindowsAzure.Storage, Version=7.2.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]' türündeki 'Microsoft.WindowsAzure.Storage.Core.Util.CommonUtility+<LazyEnumerable>d__01 [Microsoft.WindowsAzure.Storage.Blob.IListBlobItem] »серьезный набор данных.] System.Web.UI.ObjectStateFormalue.Serialize значение) +3770 System.Web.UI.ObjectStateFormatter.Serialize (поток вывода, объект stateGraph) +144 System.Web.UI.ObjectStateFormatter.Serialize (объект stateGraph, цель назначение) +71 System.Web.UI.ObjectStateFormatter.System. Web.UI.IStateFormatter.Serialize (состояние объекта) +39 System.Web.UI.Util.SerializeWithAssert (средство форматирования IStateFormatter, StateGraph объекта) +37 System.Web.UI.Control.EstimateStateSize (состояние объекта) +45 System.Web. UI.Control.BuildProfileTree (String parentId, Boolean calcViewState) +71 System.Web.UI.Page.BuildPageProfileTree (Boolean enableViewState) +42 System.Web.UI.Page.ProcessRequestMain (Boolean includeStagesBeforeAsyncPointState, Boolean includeStagesBeforeAsyncPointState) +5761


person Alican Kablan    schedule 23.04.2017    source источник
comment
Я обнаружил ошибку, IEnumerable ‹IListBlobItem› не может добавить в состояние просмотра   -  person Alican Kablan    schedule 23.04.2017


Ответы (1)


Как вы говорите, IEnumerable не может добавлять в viewstate и не может быть источником данных для gridview.

Насколько мне известно, IListBlobItem - это интерфейс. IEnumerable содержит три типа элементов BLOB-объектов.

CloudBlockBlob,CloudPageBlob,CloudBlobDirectory

Поэтому я предлагаю вам сначала проверить тип и преобразовать его в datatable или что-то еще, а затем добавить его в ViewState.

Как показано ниже:

  DataTable d1 = new DataTable();
            d1.Columns.Add("Type");
            d1.Columns.Add("Id");
            d1.Columns.Add("Url");
            foreach (var item in blobs)
            {
                if (item.GetType() == typeof(CloudBlockBlob))
                {
                    CloudBlockBlob blob = (CloudBlockBlob)item;

                    d1.Rows.Add("CloudBlockBlob", blob.Name, blob.Uri);
                }
                else if (item.GetType() == typeof(CloudPageBlob))
                {
                    CloudPageBlob blob = (CloudPageBlob)item;
                    d1.Rows.Add("CloudPageBlob", blob.Name, blob.Uri);
                }
                else if (item.GetType() == typeof(CloudBlobDirectory))
                {
                    CloudBlobDirectory blob = (CloudBlobDirectory)item;
                    d1.Rows.Add("directory", blob.StorageUri, blob.Uri);
                }

            }
            ViewState.Add(container.Name, d1);

Результат:  введите описание изображения здесь


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

Насколько мне известно, вам нужно заплатить за BLOB-объект списка в лазурном цвете (0,10 доллара США LRS Cold за 10 000). Поэтому я предлагаю вам использовать viewstate для хранения результата операции listblob, если вам не нужно обновлять список blob.


Как я могу справиться с истечением срока действия sas в моем asp.net, это будет более 1000 пользователей .. Когда я удалю blobContainer.GetPermissions (); и создайте новый и установите его. Другой пользователь, который загрузит, потерпит неудачу, потому что я создаю новый sas для другого пользователя.

Насколько мне известно, если вы удалите разрешения blobContainer, он удалит политику доступа SAS.

Тогда все токены SAS, созданные в соответствии с этой политикой доступа SAS, будут бесполезны.

Обычно мы могли создать политику доступа без даты истечения срока действия.

Затем вы можете указать дату истечения срока действия в соответствии с этой политикой доступа при создании подписанного URL-адреса для определенных пользователей.

Коды приведены ниже:

  SharedAccessPolicy sharedAccessPolicy = new SharedAccessPolicy();
    sharedAccessPolicy.Permissions = SharedAccessPermissions.Read;
    sharedAccessPolicy.SharedAccessStartTime = DateTime.UtcNow;
    //sharedAccessPolicy.SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(1); No need to define expiry time here.

    BlobContainerPermissions blobContainerPermissions = new BlobContainerPermissions();
    blobContainerPermissions.SharedAccessPolicies.Add("default", sharedAccessPolicy);

    container.SetPermissions(blobContainerPermissions);

    Console.WriteLine("Press any key to continue....");
    Console.ReadLine();
    CloudBlob blob = container.GetBlobReference(path);

    string sas = blob.GetSharedAccessSignature(new SharedAccessPolicy()
    {
        SharedAccessExpiryTime = DateTime.UtcNow.AddDays(7),//add expiry date only when you're creating the signed URL
    }
        , "default");

    Console.WriteLine(blob.Uri.AbsoluteUri + sas);

    Process.Start(new ProcessStartInfo(blob.Uri.AbsoluteUri + sas));

    Console.WriteLine("Press any key to continue....");
    Console.ReadLine();

Кроме того, мы могли бы создать 5 политик доступа, поэтому я предлагаю вам создать другую политику доступа и создать разные токены SAS для разных пользователей.

person Brando Zhang    schedule 24.04.2017
comment
хм .. да, вы правы, новая таблица данных - хорошая идея. Спасибо за совет, вы лучше всех :) Будет лучше просматривать состояние или я снова выберу лазурь для списка в режиме без обратной передачи и обратной передачи? - person Alican Kablan; 25.04.2017
comment
Могу я задать второй и последний вопрос :) Как я могу справиться с истечением срока действия sas в моем asp.net, это будет более 1000 пользователей .. Когда я удалю blobContainer.GetPermissions (); и создайте новый и установите его. Другой пользователь, который загрузит, потерпит неудачу, потому что я создаю новый sas для другого пользователя. - person Alican Kablan; 25.04.2017
comment
Обновите ответ - person Brando Zhang; 25.04.2017
comment
тогда для меня имеет смысл viewstate. Мне нужен только листинг. Я думаю, что разрешение на чтение контейнера не несет никакой угрозы безопасности без ссылки на blob: я представляю blob с помощью Sas + uri. Мне жаль, что я устал от вас, но я многому научился, может быть, другие друзья могут выгода отсюда .. - person Alican Kablan; 25.04.2017
comment
Используя правильный SAS, мы могли читать или обновлять большой двоичный объект с помощью url + SAS. Но если вы оставите свой токен SAS и его срок действия не истечет, каждый сможет получить доступ к этому контейнеру больших двоичных объектов без авторизации. Кроме того, я рад помочь другим решить проблему. Если вы считаете, что ответ уже решил вашу проблему, отметьте его как ответ, чтобы помочь другим людям, столкнувшимся с той же проблемой. Спасибо. - person Brando Zhang; 25.04.2017
comment
blob.Uri.AbsoluteUri + sas из этого uri может кто угодно перейти к моему контейнеру, в конечном итоге я установил разрешение на чтение для моего контейнера .. sharedAccessPolicy.Permissions = SharedAccessPermissions.Read; - person Alican Kablan; 25.04.2017