Ключ хранилища таблиц в виде сообщения в очередь Azure

Я могу вставить ключ строки и ключ раздела в хранилище таблиц Azure:

TableOperationinsertOperation = TableOperation.Insert(customer1); таблица.Выполнить(insertOperation); StoreKeyInQ(insertOperation);

// Create a new customer entity.
        CustomerEntity customer1 = new CustomerEntity("URL", "Name"+Guid.NewGuid());
        customer1.path = fullpath;

"CustomerEntity" выглядит следующим образом:

public class CustomerEntity : TableEntity
    {
        public CustomerEntity(string ID, string Name)
        {
            this.PartitionKey = ID;
            this.RowKey = Name;
        }

        public CustomerEntity() { }

        public string path { get; set; }


    }

Я написал код для создания очереди, как показано ниже:

 public void StoreKeyInQ(TableOperation insertOperation)
    {
        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnectionString"));
        //craete a queue client
        CloudQueueClient cloudQueueClient = storageAccount.CreateCloudQueueClient();
        //retrive a reference to a container
        CloudQueue cloudQueue = cloudQueueClient.GetQueueReference("myqueue");
        //create the queue if does not exists
        cloudQueue.CreateIfNotExists();

       // Create a message and add it to the queue.
       CloudQueueMessage message = new CloudQueueMessage(insertOperation); //Here is the error as "CloudQueueMessage" can't take a argument type "TableOperation"
       queue.AddMessage(message);
    }

Как решить эту ошибку? Как передать ключ «rowkey» и «partition» хранилища таблицы в очередь?

  EDIT:

Я добавил эти две строки для сериализации, это нормально?

 System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(customerEntity.GetType());
        CloudQueueMessage message = new CloudQueueMessage(x.ToString());

Моя очередь выглядит так; однако не уверен, правильно это или нет? Кто-нибудь может пояснить - это правильно?

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


person AskMe    schedule 09.05.2018    source источник
comment
Не уверен, что вы пытаетесь сделать! Вы пытаетесь вставить сообщение в очередь (тогда зачем создавать всю эту таблицу) или вы пытаетесь вставить объект в таблицу (тогда зачем вся эта очередь)?   -  person Gaurav Mantri    schedule 09.05.2018
comment
В основном идея состоит в том, чтобы сохранить RowKey+PartitionKey в очереди и создать рабочую роль для извлечения ключа (RowKey+PartitionKey) из очереди.   -  person AskMe    schedule 09.05.2018
comment
Пожалуйста, отредактируйте свой вопрос и включите код для вашей модели Customer. По сути, вам нужно будет сериализовать свою модель как строку, а затем сохранить ее как сообщение. На принимающей стороне вы снова десериализуете его и получите объект, а оттуда вы сможете получить значения PartitionKey и RowKey.   -  person Gaurav Mantri    schedule 09.05.2018
comment
Вы пытаетесь вставить в очередь пользовательский объект, который принимает только байтовые массивы или строки. Вам нужно изменить это (например, отправить JSON, csv, любой другой сериализованный в строку или сериализованный в массив байтов формат).   -  person David Makogon    schedule 09.05.2018
comment
@GauravMantri Я отредактировал вопрос в соответствии с вашими инструкциями. Надеюсь, мое редактирование правильное.   -  person AskMe    schedule 10.05.2018


Ответы (1)


Как решить эту ошибку?

Если мы хотим вставить сообщение в очередь. Мы могли бы получить очередь операций

демонстрация кода из Начните работу с хранилищем очередей Azure с помощью .NET

// Retrieve storage account from connection string.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
    CloudConfigurationManager.GetSetting("StorageConnectionString"));

// Create the queue client.
CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();

// Retrieve a reference to a queue.
CloudQueue queue = queueClient.GetQueueReference("myqueue");

// Create the queue if it doesn't already exist.
queue.CreateIfNotExists();

// Create a message and add it to the queue.
CloudQueueMessage message = new CloudQueueMessage("RowKey, PartitionKey ");
queue.AddMessage(message);

Как передать ключ «rowkey» и «partition» хранилища таблицы в очередь?

Вы можете сериализовать свою модель как строку, а затем сохранить ее как сообщение, или вы можете использовать свой формат настройки для сохранения сообщения, такого как формат сообщения: RowKey, PartitionKey

В основном идея состоит в том, чтобы сохранить RowKey+PartitionKey в очереди и создать рабочую роль для извлечения ключа (RowKey+PartitionKey) из очереди.

Если вы просто хотите получить сообщение очереди, мы можем использовать много дешевых способов, таких как Триггер очереди веб-заданий или триггер очереди функций Azure.

Обновление:

Пожалуйста, попробуйте использовать следующий код.

using Newtonsoft.Json;
CloudQueueMessage message = new CloudQueueMessage(JsonConvert.SerializeObject(customer1));
cloudQueue.AddMessage(message);

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

Дополнительный демонстрационный код см. на странице SerializeObject или Десериализовать объект.

person Tom Sun - MSFT    schedule 09.05.2018
comment
В OP уже есть информация о вставке в очередь. Проблема в том, что они пытаются вставить пользовательский объект, а очереди обрабатывают только байтовые массивы или строки. Кроме того, вопрос о том, как обрабатывать сообщение очереди, выходит за рамки вопроса (ну, в лучшем случае он неоднозначен). - person David Makogon; 09.05.2018
comment
Я обновил свой вопрос с помощью CustomerEntity. Не могли бы вы дать больше пояснений по поводу вашего ответа? - person AskMe; 10.05.2018
comment
Я обновил ответ, указав, как сериализовать или десериализовать объект. - person Tom Sun - MSFT; 11.05.2018