Я запустил это в режиме отладки и прикрепляю изображение с деталями исключения. Как я могу узнать, что пошло не так? Я пытался вставить данные в таблицу. Разве лазурь не может дать мне более подробную информацию?
Замечания: Хранилище находится в Windows Azure, а не на моем компьютере. Таблицы были созданы, но я получаю эту ошибку при вставке данных
// Retrieve the storage account from the connection string.
Microsoft.WindowsAzure.Storage.CloudStorageAccount storageAccount = Microsoft.WindowsAzure.Storage.CloudStorageAccount.Parse("DefaultEndpointsProtocol=https;AccountName=***;AccountKey=***");
// Create the table client.
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
// Create the table if it doesn't exist.
CloudTable table = tableClient.GetTableReference("EmployeeOnlineHistory");
table.CreateIfNotExists();
и вот код вставки:
public static void SetStatus(Employee e, bool value)
{
try
{
// Retrieve the storage account from the connection string.
Microsoft.WindowsAzure.Storage.CloudStorageAccount storageAccount = Microsoft.WindowsAzure.Storage.CloudStorageAccount.Parse("DefaultEndpointsProtocol=https;AccountName=###;AccountKey=###");
// Create the table client.
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
// Create the CloudTable object that represents the "people" table.
CloudTable table = tableClient.GetTableReference("EmployeeOnlineHistory");
// Create a new customer entity.
if (value == true)
{
EmployeeOnlineHistory empHistory = new EmployeeOnlineHistory(e.Id);
empHistory.IsOnline = true;
empHistory.OnlineTimestamp = DateTime.Now;
TableOperation insertOperation = TableOperation.Insert(empHistory);
table.Execute(insertOperation);
}
else
{
TableQuery<EmployeeOnlineHistory> query = new TableQuery<EmployeeOnlineHistory>()
.Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, e.Id.ToString()));
EmployeeOnlineHistory entity = table.ExecuteQuery(query).Take(1).FirstOrDefault();
if ((entity!=null)&&(entity.IsOnline))
{
entity.IsOnline = false;
entity.OfflineTimestamp = DateTime.Now;
entity.OnlineTime = (entity.OfflineTimestamp - entity.OnlineTimestamp);
TableOperation updateOperation = TableOperation.Replace(entity);
table.Execute(updateOperation);
}
else
{
EmployeeOnlineHistory empHistory = new EmployeeOnlineHistory(e.Id);
empHistory.IsOnline = false;
empHistory.OfflineTimestamp = DateTime.Now;
TableOperation insertOperation = TableOperation.Insert(empHistory);
table.Execute(insertOperation);
}
}
}
catch (Exception ex)
{
//var details = new System.IO.StreamReader(((Microsoft.WindowsAzure.Storage.StorageException)ex)..Response.GetResponseStream()).ReadToEnd();
LogFile.Error("EmployeeOnlineHistory.setStatus",ex);
}
}
Ответы:
Ошибка 400 означает, что что-то не так со значением одного из ваших свойств. Один из способов узнать это - отследить запрос / ответ через Fiddler и увидеть фактические данные, отправляемые в хранилище Windows Azure.
Делая безумное предположение, я предполагаю, быстро взглянув на ваш код, что в вашей модели у вас есть некоторые свойства типа Date / Time (OfflineTimestamp, OnlineTimestamp), и заметил, что в определенных сценариях один из них инициализируется значением по умолчанию, которое " DateTime.MinValue ". Обратите внимание, что минимальное допустимое значение для атрибута типа «Дата / время» - 1 января 1601 г. (UTC) в Windows Azure [http://msdn.microsoft.com/en-us/library/windowsazure/dd179338.aspx] . Пожалуйста, посмотри, если это не так. В этом случае вы можете сделать их полями типа, допускающими значение NULL, чтобы они не заполнялись значениями по умолчанию.
Взгляните на ответ Юхи Паломяки ниже ... иногда бывает немного более полезное сообщение в исключении, где он предлагает (RequestInformation.ExtendedErrorInformation.ErrorMessage)
источник
StorageException также содержит более подробную информацию об ошибке.
Проверьте отладчик: StorageException.RequestInformation.ExtendedInformation
источник
The specifed resource name contains invalid characters.
в имени моей таблицы были тире ... как и в именах моей очереди ... вздох. Надеюсь, поиск подберет это для большего количества людей! см .: stackoverflow.com/questions/45305556/…В моем случае это была косая черта в RowKey .
Я также получил OutOfRangeInput - один из входных данных запроса вне допустимого диапазона. ошибка при попытке добавить вручную через эмулятор хранилища.
http://msdn.microsoft.com/en-us/library/dd179338.aspx
Я написал метод расширения, чтобы справиться с этим за меня.
источник
Я столкнулся с той же проблемой, но в моем случае причина была в размере. Покопавшись в дополнительных свойствах исключения (RequestInformation.ExtendedErrorInformation), нашел причину:
ErrorCode: PropertyValueTooLarge ErrorMessage: значение свойства превышает максимально допустимый размер (64 КБ). Если значение свойства является строкой, она закодирована в UTF-16, а максимальное количество символов должно быть не более 32 КБ.
источник
ну, в моем случае я пытался это сделать:
из-за ContainerName
SessionMaterials
(по привычке писать в Pascal Case и Camel Case: D) он вызывал 400 неверных запросов. Так что мне просто нужно это сделатьsessionmaterials
. и это сработало.Надеюсь, это кому-то поможет.
PS: - Просто проверьте HTTP-ответ исключения или используйте скрипач для захвата запроса и ответа.
источник
в моем случае: имя контейнера было заглавной буквой. есть ограничения при использовании символов.
источник
Иногда это потому , что ваш
partitionKey
илиrowKey
являетсяNULL
(это было для меня)
источник
Документацию от MS обо всех кодах ошибок службы таблиц можно найти здесь
источник
У меня была такая же ошибка BadRequest (400), в конце заполняю вручную:
И работал у меня. Надеюсь это поможет!
источник
Timestamp
нужно сгенерировать вручную. Это действительно раздражает.Я тоже столкнулся с такой же проблемой. В моем случае значение PartitionKey не было установлено, поэтому по умолчанию значение PartitionKey было нулевым, что привело к
Object reference not set to an instance of an object.
исключениюПроверьте, указываете ли вы соответствующие значения для PartitionKey или RowKey, вы можете столкнуться с такой проблемой.
источник
Я исправил свои случаи, и все заработало
Мои кейсы:
источник
Я получал 400 неверных запросов, потому что я использовал ZRS (Zone Redundant Storage), а аналитика недоступна для этого типа хранилища. Я не знал, что использую Google Analytics.
Я удалил контейнер для хранения и воссоздал его как GRS, и теперь он работает нормально.
источник
Я получал (400) неверный запрос, StatusMessage: Bad Request, ErrorCode: OutOfRangeInput, когда у объекта было свойство DateTime не установлено (= DateTime.MinValue)
источник
В моем случае: я включил метаданные blob с именем тега, содержащим дефис.
"added-by"
Проблемой был дефис , и позже RTFM сказал мне, что имена тегов должны соответствовать соглашениям об идентификаторах C #.Ссылка: https://docs.microsoft.com/en-us/azure/storage/blobs/storage-properties-metadata
Подчеркивание работает нормально.
источник
В моем случае я не должен добавлять PartitionKey и Rowkey в свой класс сущности. Он должен быть из базового класса. Ниже будет просто работать.
источник
Если вы используете NodeJS и наткнулись на этот пост только для того, чтобы обнаружить, что вы не получаете такой прекрасной подробной информации в своем объекте ошибки; вы можете использовать прокси для получения этих данных. Однако, поскольку здесь никто не упоминает, КАК использовать прокси.
Самый простой способ с NodeJS - установить две переменные среды:
Если вы действительно используете C #, как это делает автор этой статьи; вы можете просто установить Fiddler и настроить его на перехват. По умолчанию он должен перехватывать запросы. Возможно, вам также потребуется доверять сертификату Fiddler или иным образом выполнить эквивалент узла «NODE_TLS_REJECT_UNAUTHORIZED = 0».
источник
Я получил ответ 400-BadRequest от API таблицы учетных записей хранения Azure. Информация об исключении показала, что «Учетная запись, к которой осуществляется доступ, не поддерживает http.». Я решил, что мы должны использовать https в строке подключения, когда в конфигурации учетной записи хранения включен параметр «Требуется безопасная передача», как показано на изображении ниже.
источник
В моем случае для создания нового экземпляра класса «TableBotDataStore» (фреймворк MS-ботов) мы передаем параметр «tableName» с дефисом, например «master-bot», а TableBotDataStore может иметь имена таблиц только с буквами и цифрами.
источник
У меня была такая же проблема, функция передавала
containerNameKey
строку as. ниже приведен код, который дал ошибкуЯ изменил это на
Это сработало
источник