Таблица хранилища Azure возвращает исключение 400 Bad Request

Я пытаюсь создать таблицу лазурного хранилища и вставлять в нее записи с помощью С#. Я успешно создал таблицу, но она дает мне исключение хранилища 400 Bad Request при вставке в нее записи.

после проверки в отладчике:

StorageException.RequestInformation.ExtendedErrorInformation.ErrorMessage

он показывает ошибку OutOfRangeInput

"One of the request inputs is out of range.\nRequestId:862fdbae-6002-000c-1e7c-ef9373000000\nTime:2019-04-10T09:06:05.9840359Z"

Я воспользовался помощью этой темы Хранилище таблиц Azure возвращает 400 неверных запросов

а также

  • попытался передать null в переменные моей модели объекта, чтобы увидеть, не выходит ли какая-либо запись из допустимого диапазона
  • пытался пройти "тест" в RowKey
  • пытался пройти "1"/"тест" в PartitionKey
  • попытался передать Guid.NewGuid().ToString() или ToAzureKeyString(Guid.NewGuid().ToString()) в RowKey
  • попытался передать DateTimeOffset.Now в Timestamp

все равно выдает ту же ошибку. Вот мой код:

public void GetGPSFileData(Config objConfig, TraceWriter log)
{
    try
    {
        BindData objData = new BindData();
        string date = DateTime.Now.Date.ToString("ddMMyyyy");
        string storageTable = "TABLE" + date + objData.REPCODE;
        TableStorage tableStorage = new TableStorage(objData);
        CreateTableStorage(objConfig, storageTable, tableStorage, log);
    }
    catch (StorageException ex)
    {
        log.Info($"Storage Exception while reading GPS File Data from Azure Storage: " + ex.RequestInformation.ExtendedErrorInformation.ErrorMessage + DateTime.Now);
        throw ex;
    }
    catch (Exception ex)
    {
        log.Info($"Error while reading GPS File Data from Azure Storage: " + ex.Message + DateTime.Now);
        throw ex;
    }
}

TableStorage.cs

public class TableStorage: TableEntity
{
    public string CLIENTID { get; set; }
    public string REPCODE { get; set; }
    public int ENTRYNO { get; set; }
    public string DEVICEID { get; set; }
    public double LAT { get; set; }
    public double LNG { get; set; }
    public DateTime DATE_TIME { get; set; }

    public string PCODE { get; set; }
    public string PNAME { get; set; }
    public DateTime TXNDATE { get; set; }

    public TableStorage(BindData objData)
    {
        PartitionKey = objData.CLIENTID;
        RowKey = ToAzureKeyString(Guid.NewGuid().ToString());
        Timestamp = DateTimeOffset.Now;

        CLIENTID = objData.CLIENTID;
        REPCODE = objData.REPCODE;
        ENTRYNO = objData.ENTRYNO;
        DEVICEID = objData.DEVICEID;
        LAT = objData.LAT;
        LNG = objData.LNG;
        DATE_TIME = objData.DATE_TIME;
        PCODE = objData.PCODE;
        PNAME = objData.PNAME;
        TXNDATE = objData.TXNDATE;
    }

    public string ToAzureKeyString(string str)
    {
        var sb = new StringBuilder();
        foreach (var c in str
            .Where(c => c != '/'
                        && c != '\\'
                        && c != '#'
                        && c != '/'
                        && c != '?'
                        && !char.IsControl(c)))
            sb.Append(c);
        return sb.ToString();
    }
}

Создайте и вставьте в код Storage Table:

public void CreateTableStorage(Config objConfig, string tableName, TableStorage tableStorage, TraceWriter log)
{
    try
    {
        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(objConfig.TABLE_STORAGE_CONN_STRING);
        CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
        CloudTable table = tableClient.GetTableReference(tableName);
        table.CreateIfNotExists();

        TableOperation insert = TableOperation.Insert(tableStorage);
        table.Execute(insert);
    }
    catch(StorageException ex)
    {
        log.Info($"Storage Exception while inserting record into Table Storage: " + ex.RequestInformation.ExtendedErrorInformation.ErrorMessage + DateTime.Now);
        throw ex;
    }
    catch(Exception ex)
    {
        log.Info($"Error while inserting record into Table Storage: " + ex.Message + DateTime.Now);
        throw ex;
    }
}

Объект класса TableStorage содержит: Таблица хранилища Azure возвращает исключение 400 Bad Request

В чем может быть проблема? Я совершенно новый лазурный стол для хранения. Пожалуйста помоги. Заранее спасибо.

Есть ли какие-либо символы, такие как «/» в строке, когда вы пытаетесь вставить?

Ivan Yang 10.04.2019 11:37

@IvanYang Нет, я проверял каждое значение перед вставкой, даже пытался передать пустую или нулевую строку

Shreyas Pednekar 10.04.2019 11:39
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
2
981
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я считаю, что в вашем классе может отсутствовать конструктор по умолчанию/без параметров, наследующий TableEntity. Конструктор без параметров очень нужен для десериализации объекта при получении из TableStorage.

Обратитесь к этот ответ.

Возможный исправленный код:

public class TableStorage: TableEntity
{
    public string CLIENTID { get; set; }
    public string REPCODE { get; set; }
    public int ENTRYNO { get; set; }
    public string DEVICEID { get; set; }
    public double LAT { get; set; }
    public double LNG { get; set; }
    public DateTime DATE_TIME { get; set; }

    public string PCODE { get; set; }
    public string PNAME { get; set; }
    public DateTime TXNDATE { get; set; }
    public TableStorage(){}//Added default constructor
    public TableStorage(BindData objData)
    {
        PartitionKey = objData.CLIENTID;
        RowKey = ToAzureKeyString(Guid.NewGuid().ToString());
        Timestamp = DateTimeOffset.Now;

        CLIENTID = objData.CLIENTID;
        REPCODE = objData.REPCODE;
        ENTRYNO = objData.ENTRYNO;
        DEVICEID = objData.DEVICEID;
        LAT = objData.LAT;
        LNG = objData.LNG;
        DATE_TIME = objData.DATE_TIME;
        PCODE = objData.PCODE;
        PNAME = objData.PNAME;
        TXNDATE = objData.TXNDATE;
    }

    public string ToAzureKeyString(string str)
    {
        var sb = new StringBuilder();
        foreach (var c in str
            .Where(c => c != '/'
                        && c != '\\'
                        && c != '#'
                        && c != '/'
                        && c != '?'
                        && !char.IsControl(c)))
            sb.Append(c);
        return sb.ToString();
    }
}

Я передавал 01.01.01 в TXNDATE, после передачи правильной даты в TXNDATE все работало успешно. Даже если я не создаю конструктор без параметров в TableStorage, он работает, мне действительно нужно создавать конструктор без параметров?

Shreyas Pednekar 10.04.2019 11:46

Я думаю, да, он вам понадобится, так как операция чтения не будет работать без него. Итак, в настоящее время я считаю, что вы не читаете какие-либо данные из хранилища, но когда вы будете это делать, вам понадобится конструктор без параметров.

Tayyab 10.04.2019 12:08

Да, это выдавало мне ошибку при чтении данных

Shreyas Pednekar 10.04.2019 14:36

Надеюсь, это также решит вашу проблему с чтением :)

Tayyab 11.04.2019 05:30

Да, это решило. Спасибо :)

Shreyas Pednekar 11.04.2019 06:33
Ответ принят как подходящий

Проблема возникает из-за значения атрибута TXNDATE. Если вы посмотрите на изображение, которым вы поделились, значение, которое вы отправляете, равно 1/1/01 (т. е. DateTime.MinValue), тогда как минимально допустимое значение равно 1/1/1601.

Как только вы передадите правильное значение для TXNDATE, вы не должны увидеть эту ошибку.

Спасибо, я попытался передать дату в TXNDATE, и это сработало.

Shreyas Pednekar 10.04.2019 11:43

Другие вопросы по теме