Eu executei isso no modo de depuração e anexei uma imagem com os detalhes da exceção. Como posso saber o que deu errado? Eu estava tentando inserir dados em uma tabela. O azure não pode me dar mais detalhes?
Obs: O armazenamento está no Windows Azure e não na minha máquina. As tabelas foram criadas, mas recebo este erro ao inserir dados
// 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();
e aqui está o código de inserção:
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);
}
}
Respostas:
Erro 400 significa que há algo errado com o valor de uma de suas propriedades. Uma maneira de descobrir é rastrear a solicitação / resposta por meio do Fiddler e ver os dados reais sendo enviados ao Armazenamento do Windows Azure.
Fazendo um palpite, estou assumindo, dando uma rápida olhada em seu código, que em seu modelo você tem algumas propriedades do tipo Date / Time (OfflineTimestamp, OnlineTimestamp) e observei que em certos cenários um deles é inicializado com o valor padrão que é " DateTime.MinValue ". Observe que o valor mínimo permitido para um atributo do tipo Data / Hora é 1º de janeiro de 1601 (UTC) no Windows Azure [http://msdn.microsoft.com/en-us/library/windowsazure/dd179338.aspx] . Por favor, veja se não é esse o caso. Se for esse o caso, você pode torná-los campos do tipo anuláveis para que não sejam preenchidos com os valores padrão.
Dê uma olhada na resposta de Juha Palomäki abaixo também ... às vezes há uma mensagem um pouco mais útil na exceção onde ele sugere (RequestInformation.ExtendedErrorInformation.ErrorMessage)
fonte
A StorageException também contém informações um pouco mais detalhadas sobre o erro.
Verifique no depurador: StorageException.RequestInformation.ExtendedInformation
fonte
The specifed resource name contains invalid characters.
o nome da minha mesa tinha travessões ... assim como os nomes das minhas filas ... suspiro. Esperançosamente, a pesquisa ajudará mais pessoas! consulte: stackoverflow.com/questions/45305556/…No meu caso, foi uma barra no RowKey .
Também recebi um 'OutOfRangeInput - uma das entradas de solicitação está fora do intervalo.' erro ao tentar adicionar manualmente por meio do emulador de armazenamento.
http://msdn.microsoft.com/en-us/library/dd179338.aspx
Eu escrevi um método de extensão para lidar com isso para mim.
fonte
Enfrentei o mesmo problema, mas o motivo no meu caso foi devido ao tamanho. Depois de pesquisar as propriedades de exceção adicionais (RequestInformation.ExtendedErrorInformation), encontrou o motivo:
ErrorCode: PropertyValueTooLarge ErrorMessage: O valor da propriedade excede o tamanho máximo permitido (64 KB). Se o valor da propriedade for uma string, ele será codificado em UTF-16 e o número máximo de caracteres deverá ser 32 K ou menos.
fonte
bem, no meu caso, eu estava tentando fazer isso:
por causa de ContainerName
SessionMaterials
(como um hábito de escrever em Pascal Case e Camel Case: D) estava causando 400 solicitações incorretas. Então, eu só tenho que fazer issosessionmaterials
. e funcionou.Espero que isso ajude alguém.
PS: - Basta verificar a resposta http da exceção ou usar o fiddler para capturar a solicitação e a resposta.
fonte
no meu caso: o nome do contêiner estava em maiúscula. existem limitações ao usar chars.
fonte
Às vezes é porque seu
partitionKey
ourowKey
éNULL
(foi o meu caso)
fonte
Uma documentação da MS sobre todos os códigos de erro do serviço de tabela pode ser encontrada aqui
fonte
Tive o mesmo erro BadRequest (400), no final preencho manualmente:
E funcionou para mim. Espero que isto ajude!
fonte
Timestamp
deve ser gerado manualmente. É realmente irritante.Eu também enfrentei o mesmo tipo de problema. No meu caso, o valor de PartitionKey não foi definido, portanto, por padrão, o valor de PartitionKey era nulo, o que resultou em
Object reference not set to an instance of an object.
exceçãoVerifique se você está fornecendo os valores apropriados para PartitionKey ou RowKey, você pode enfrentar esse problema.
fonte
Eu consertei meus casos e funcionou bem
Meus casos:
fonte
Recebi um 400 Bad Request porque estava usando ZRS (Zone Redundant Storage) e o Analytics não está disponível para esse tipo de armazenamento. Eu não sabia que estava usando o Analytics.
Excluí o contêiner de armazenamento e recriei como GRS e agora funciona bem.
fonte
Eu estava recebendo um (400) Bad Request, StatusMessage: Bad Request, ErrorCode: OutOfRangeInput quando a entidade tinha uma propriedade DateTime não definida (= DateTime.MinValue)
fonte
No meu caso: incluí metadados de blob com um nome de tag contendo um hífen.
O travessão
"added-by"
era o problema e, posteriormente, o RTFM me disse que os nomes das tags devem estar em conformidade com as convenções de identificador C #.Ref: https://docs.microsoft.com/en-us/azure/storage/blobs/storage-properties-metadata
O sublinhado funciona bem.
fonte
No meu caso, não devo adicionar PartitionKey e Rowkey na minha classe de entidade. Deve ser da classe base. Abaixo apenas funcionaria.
fonte
Se você está usando o NodeJS e se deparou com esta postagem, apenas para descobrir que não obteve essas informações detalhadas adoráveis em seu objeto de erro; você pode utilizar um proxy para obter esses detalhes. No entanto, como ninguém aqui menciona COMO usar um proxy.
A maneira mais simples com o NodeJS é definindo duas variáveis ambientais:
Se você estiver realmente utilizando C #, como o autor deste post está fazendo; você pode simplesmente instalar o Fiddler e configurá-lo para interceptar. Por padrão, ele deve interceptar as solicitações. Você também pode precisar confiar no certificado do Fiddler ou, de outra forma, fazer o equivalente ao "NODE_TLS_REJECT_UNAUTHORIZED = 0" do Node.
fonte
Recebi uma resposta 400-BadRequest da API da Tabela de Contas de Armazenamento do Azure. As informações de exceção mostraram que "A conta que está sendo acessada não suporta http.". Percebi que devemos usar https na string de conexão quando "Transferência segura necessária" estiver habilitada na configuração da conta de armazenamento, conforme mostrado na imagem abaixo.
fonte
No meu caso, para criar uma nova instalação da classe "TableBotDataStore" (MS bot framework), passamos o parâmetro "tableName" com hífen como "master-bot" e TableBotDataStore pode ter nomes de tabelas apenas com letras e números
fonte
Tive o mesmo problema, a função estava passando o
containerNameKey
as string. abaixo está o código que deu erroEu mudei para
Funcionou
fonte